Ранг (язык программирования J) - Rank (J programming language)

Классифицировать является обобщением зацикливание как используется в скалярных (не-множество -ориентированный) языки программирования.[1][2] Это также обобщение mapcar на языке Лисп[3] и карта в современном функциональное программирование языков, и обобщение скалярного расширения, внутренний (матрица ) продукт и внешний продукт в APL 360. Канонической реализацией ранга может быть язык J, но он также доступен в Dyalog APL, то Международная организация по стандартизации (ISO) технический стандарт на расширенном APL и NARS2000.

Ранг имеет несколько разных значений. В целом концепция классифицировать используется для обработки ортогонального массива с точки зрения его подмассивов.[4] Например, с двумерным массивом можно работать с рангом 2 как со всей матрицей, с рангом 1 для работы с его неявными одномерными столбцами или строками или с рангом 0 для работы на уровне его отдельных атомов.

  • Существительное ранг - Ранг существительного неотрицательный целое число.
  • Ранг глагола - Ранг глагола - это список из трех целых чисел.
  • Ранговое соединение - Ранг конъюнкция (") используется для образования глагола с определенным рангом.

Рейтинг как обобщение цикла

Понимание ранга требует знания некоторых очень простых концепций программирования, ориентированного на массивы. В большинстве языков, основанных на массивах, сокращение обозначается прямым слэш /. В J косая черта принимает левый аргумент функции и правый аргумент массива, который будет уменьшен этой функцией.

   +/ 1 2 36

Результат 1 + 2 + 3, как и ожидалось.

N-мерный целочисленный массив также может быть создан с помощью я. который принимает в качестве аргументов вектор целых чисел. Количество целых чисел определяет размер, а абсолютное значение каждого целого числа определяет длину соответствующего измерения.

   я. 30 1 2   я. 2 30 1 23 4 5   я. 2 3 4 0  1  2  3 4  5  6  7 8  9 10 1112 13 14 1516 17 18 1920 21 22 23

Теперь уменьшим двумерный массив сложением.

   +/ я. 2 33 5 7

Результат 0 1 2 + 3 4 5, как и ожидалось. Сокращение идет вниз по каждому столбцу, складывая все числа в этом столбце.

Это приложение +/ двумерному массиву соответствует фрагмент кода C:[5]

за(j = 0; j < 3; ++j) {    сумма[j] = 0;}за(я = 0; я < 2; ++я) {    за(j = 0; j < 3; ++j) {        сумма[j] += множество[я][j];    }}

Предположим, мы хотим сложить элементы каждой строки, как в фрагменте кода C:

за(я = 0; я < 2; ++я) {    сумма[я] = 0;    за(j = 0; j < 3; ++j) {        сумма[я] += множество[я][j];    }}

Чтобы добиться результата 3 12. Мы можем сделать это в J без цикла, просто используя rank.

   +/"1 я. 2 33 12

Чтобы дополнительно проиллюстрировать, как ранг работает в J, мы можем видеть, что исходное выражение - это ранг 2. Оператор отображается на самом высоком ранге в массив.

   +/"2 я. 2 33 5 7

Этими именами принято называть массивы меньшей размерности,[6] хотя иногда они оспариваются.[7]

ИмяКлассифицировать
Атом или скаляр0
Вектор или список1
Таблица или матрица2
Тензор или куб3

Существительное ранг

Существительные в J массивы. Ранг существительного - это количество измерений этого массива. Производный глагол #@$ определяет ранг существительного.

Ранг глагола

Глаголы в J - это функции, которые принимают аргументы существительного и производят результаты существительного. Ранг глагола определяет, как глагол применяется к существительным с рангом больше 0. Этот ранг глагола выражается тремя числами:

  1. Ранг для случая монады; Например, −y использует как монада
  2. Ранг для левого аргумента в случае диады; Например, х-у использует как диада
  3. Ранг за правильный аргумент в случае диады

Во всех случаях есть какое-то основное определение глагола, которое применяется к клетки, которые являются подмассивами указанного ранга. Или, если аргумент не имеет такого большого количества измерений, весь аргумент.

В глаголах отрицательный ранг интерпретируется как ранг существительного, указанного для этого аргумента, за вычетом указанного значения. (Но никогда не меньше нуля.)

Например, глагол с монадическим рангом отрицательного, когда ему задан аргумент ранга 3, разбивает аргумент на список массивов ранга 2. Тело глагола применяется один раз к каждому из этих двумерных подмассивов.

В контексте конкретного глагола и конкретного существительного размеры этого существительного делятся на последовательность размеров префикса, называемую Рамка, и последовательность суффиксных размеров, называемая клетки. Положительные глагольные ранги указывают количество измерений ячейки, отрицательные глагольные ранги указывают количество измерений фрейма.

В диадическом случае есть два фрейма: один для левого аргумента и один для правого аргумента. Эти кадры должны согласовываться. Если кадры не идентичны, один должен быть префиксом другого; например (т. 2 3) * "0 1 я. 2 3 4 умножает каждый скаляр (нульмерный элемент) слева на каждый вектор (одномерный элемент) справа. Результат вычисления этого глагола будет иметь размеры самого длинного кадра в качестве размеров префикса его результата. Конечные размеры результата, если таковые имеются, будут результатом применения глагола к соответствующей ячейке (ям). В вырожденных случаях, когда аргументы не имеют достаточной размерности, ранг глагола эффективно снижается (что может повлиять на его результат).

Например,

   10 + 4 5 6 14 15 16

Здесь глагол + имеет ранг 0 0 0, левый аргумент имеет ранг 0, а правый аргумент имеет ранг 1 (с размерностью 3). Таким образом, левый аргумент имеет фрейм ранга 0, а правый аргумент имеет фрейм ранга 1 (с размерностью 3). (Пустой) фрейм левого аргумента является допустимым суффиксом для фрейма правого аргумента, так что это допустимая операция. Результат имеет ранг 1 и размерность 3.

Ранговое соединение

Конъюнкция ранга принимает аргумент глагола слева и аргумент существительного справа для создания нового глагола. Аргумент правого существительного состоит из трех чисел, определяющих монадический ранг, диадический левый ранг и диадический правый ранг соответственно.[8]

Если правый аргумент - только два числа, они принимаются как ранги для диадического случая: первое число - это ранг левого аргумента, а второе число - ранг правого аргумента. Итак, если мы хотим добавить вектор к каждому вектору в матрице:

   1 2 3 + "1 1 я. 3 31 3 54 6 87 9 11

Если вместо этого мы хотим добавить каждый скаляр слева к каждому вектору справа, мы бы сделали это следующим образом:

   1 2 3 + "0 1 я. 3 31 2 35 6 79 10 11

Если правильным аргументом является только одно число, оно принимается в качестве ранга для всех трех случаев.

Если правильный аргумент - глагол, используется его ранг. Например, все они являются производными одного и того же глагола:

* +"0 0 0* +"0 0* +"0* +"+

Если левый аргумент соединения рангов - существительное, создается постоянный глагол. Тело этого глагола игнорирует значения любых аргументов и всегда дает результат, который является существительным.

Рекомендации

  1. ^ Слепак, Джастин; Дрожь, Олин; Манолиос, Панайотис. «Массив-ориентированный язык со статическим ранговым полиморфизмом» (PDF).
  2. ^ "Код без петель I: глаголы имеют ранг". Jsoftware.
  3. ^ "Функция mapcar". Фонд свободного программного обеспечения.
  4. ^ Бернецки Р. (декабрь 1987 г.). «Введение в ранг функции». APL88 Conference Proceedings, APL Quote Quad. 18.
  5. ^ «Управление исполнением глагола путем определения ранга». Jsoftware.
  6. ^ Рабансер, Стефан; Щур Александр; Гюннеманн, Стефан (29.11.2017). «Введение в тензорные декомпозиции и их приложения в машинном обучении». arXiv:1711.10781 [stat.ML ].
  7. ^ kgwgk; nabla9; azag0; мне; radarsat1 (24.04.2017). "HPTT: высокопроизводительная тензорная транспозиция C ++". Хакерские новости. Y комбинатор. Получено 2019-12-10.
  8. ^ Берк, Крис (12 сентября 2014 г.). «Очерки: ранг». Jsoftware.

Абрамс, П. (Февраль 1970 г.). «§II.E». Машина APL (PDF). Стэндфордский Университет (Кандидат наук).

Бэкус, Дж. У., Можно ли освободить программирование от стиля фон Неймана? Функциональный стиль и его алгебра программ (https://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf ), Сообщения ACM, том 21, номер 8, 1978-08; §11.3.3.

Бернекки Р., Введение в функцию ранга (https://dl.acm.org/citation.cfm?id=55632 ), APL88 Conference Proceedings, APL Quote Quad, Volume 18, Number 2, 1987-12.

Bernecky, R .; Айверсон, К. (6–8 октября 1980 г.). «Операторы и замкнутые массивы». Труды. 1980 год. Встреча пользователей APL. Jsoftware.

Bernecky, R .; Iverson, K.E .; McDonnell, E.E .; Metzger, R.C .; Schueler, J.H. (1983-05-02). "SATN 45: Расширения языков в мае 1983 г.". Jsoftware. И. Sharp Associates Limited.

Браун, Дж. А., Принципы APL2 (http://www.softwarepreservation.org/projects/apl/Papers/PRINCIPLESOFAPL2 ), TR 03.247, Лаборатория IBM Санта-Тереза, Сан-Хосе, Калифорния, 1984-03; §20.0.

Примечания к выпуску Dyalog, Dyalog APL Version 14.0 (http://www.dyalog.com/dyalog-version-140.htm ), Dyalog Limited, 2015.

Хуэй Р.К.У. Ранг и однородность (http://www.jsoftware.com/papers/rank.htm ), APL95 Conference Proceedings, APL Quote Quad, Volume 25, Number 4, 1995-06.

Хуэй Р.К.У. Вспоминая Кена Айверсона (https://keiapl.org/rhui/remember.htm ), 2004-11.

Хуэй Р.К.У., Внутренний продукт - старая / новая проблема (http://www.jsoftware.com/papers/innerproduct/ip.htm ), Конференция Британской ассоциации APL 2009, 08.06.2009.

Айверсон К.Э. Операторы и функции (http://www.jsoftware.com/papers/opfns.htm ), Отчет об исследовании № RC7091, IBM, 1978-04-26.

Айверсон К.Э. Словарь APL (http://www.jsoftware.com/papers/APLDictionary.htm ), APL Quote Quad, Volume 18, Number 1, 1987-09.

Айверсон, К.Е., Личный взгляд на APL (http://www.jsoftware.com/papers/APLPersonalView1.htm ), IBM Systems Journal, Volume 30, Number 4, 1991-12.

Слепак, Джастин; Дрожь, Олин; Manolios, Panagiotis, язык, ориентированный на массивы, со статическим ранговым полиморфизмом (http://www.ccs.neu.edu/home/jrslepak/typed-j.pdf ).

внешняя ссылка