Ранг (язык программирования J)
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Июль 2018 г. ) |
Ранг — это обобщение цикла , используемого в скалярных (не ориентированных на массивы ) языках программирования . [1] [2] Это также обобщение Mapcar на языке Lisp. [3] и отображение в современных языках функционального программирования , а также обобщение скалярного расширения, внутреннего ( матричного ) произведения и внешнего произведения в APL\360. Канонической реализацией ранга может быть язык J , но он также доступен в Dyalog APL , Международной организации по стандартизации (ISO) техническом стандарте для расширенного APL и NARS2000.
Ранг имеет несколько разных значений. В общем, концепция ранга используется для рассмотрения ортогонального массива с точки зрения его подмассивов. [4] Например, двумерный массив можно рассматривать на уровне 2 как на всю матрицу, или на уровне 1, чтобы работать с его неявными одномерными столбцами или строками, или на уровне 0, чтобы работать на уровне его отдельных атомов.
- Ранг существительного . Ранг существительного представляет собой неотрицательное целое число .
- Ранг глагола . Ранг глагола представляет собой список из трех целых чисел.
- Ранговый союз – Ранговый союз (
"
) используется для получения глагола определенного ранга.
Ранг как обобщение цикла
[ редактировать ]Понимание ранга требует знания некоторых базовых концепций программирования, ориентированного на массивы. В большинстве языков, основанных на массивах, сокращение обозначается косой чертой. /
. В J косая черта принимает левый аргумент функции и правый аргумент массива, который нужно уменьшить с помощью этой функции.
+/ 1 2 3
6
Результат 1 + 2 + 3
, как и ожидалось.
N-мерный целочисленный массив также можно создать с помощью i.
который принимает вектор целых чисел в качестве аргументов. Количество целых чисел определяет размерность, а абсолютное значение каждого целого числа определяет длину соответствующего измерения.
i. 3
0 1 2
i. 2 3
0 1 2
3 4 5
i. 2 3 4
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
16 17 18 19
20 21 22 23
Теперь сократим двумерный массив сложением.
+/ i. 2 3
3 5 7
Результат 0 1 2 + 3 4 5
, как и ожидалось. Сокращение выполняется по каждому столбцу, складывая все числа в этом столбце.
Это приложение +/
двумерному массиву соответствует фрагмент кода C: [5]
for(j = 0; j < 3; ++j) {
sum[j] = 0;
}
for(i = 0; i < 2; ++i) {
for(j = 0; j < 3; ++j) {
sum[j] += array[i][j];
}
}
Предположим, мы хотим сложить элементы каждой строки, как во фрагменте кода C:
for(i = 0; i < 2; ++i) {
sum[i] = 0;
for(j = 0; j < 3; ++j) {
sum[i] += array[i][j];
}
}
Чтобы получить результат 3 12
. Мы можем сделать это в J без цикла, просто используя Rank.
+/"1 i. 2 3
3 12
Чтобы проиллюстрировать, как ранг работает в J, мы можем увидеть, что исходное выражение имеет ранг 2. Оператор отображается в массив с самым высоким рангом.
+/"2 i. 2 3
3 5 7
Обычно массивы меньшей размерности называют этими именами: [6] хотя иногда они оспариваются. [7]
Имя Классифицировать Атом или скаляр 0 Вектор или список 1 Таблица или матрица 2 Тензор или куб 3
Ранг существительного
[ редактировать ]Существительные в J представляют собой массивы . Ранг существительного — это количество измерений этого массива. Производное глагол #@$
определяет ранг существительного.
глагол ранг
[ редактировать ]Глаголы в языке J — это функции, которые принимают аргументы-существительные и выдают результаты-существительные. Ранг глагола определяет, как глагол применяется к существительным с рангом больше 0. Этот ранг глагола выражается тремя числами:
- Ранг для случая монады; например,
−y
использует−
как монада - Ранг левого аргумента в случае диады; например,
x−y
использует−
как диада - Ранжирование правильного аргумента в случае диады
Во всех случаях существует некое базовое определение глагола, которое применяется к ячейкам , которые являются подмассивами указанного ранга. Или, если аргумент не имеет такого количества измерений, весь аргумент.
В глаголах отрицательный ранг интерпретируется как ранг существительного, предоставленного для этого аргумента, за вычетом указанного значения. (Но никогда не меньше нуля.)
- Например, глагол с монадическим рангом отрицательный, когда ему дан аргумент ранга 3, разбивает аргумент на список массивов ранга 2. Тело глагола применяется один раз к каждому из этих двумерных подмассивов.
В контексте конкретного глагола и конкретного существительного измерения этого существительного делятся на последовательность префиксных измерений, называемую рамкой , и последовательность суффиксных измерений, называемую ячейками . Положительные ранги глаголов указывают на количество измерений ячейки, отрицательные ранги глаголов указывают на количество измерений кадра.
В диадическом случае имеется два кадра: один для левого аргумента и один для правого аргумента. Эти рамки должны согласовываться. Если кадры не идентичны, один из них должен быть префиксом другого; например (i. 2 3) *"0 1 i. 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 i. 3 3
1 3 5
4 6 8
7 9 11
Если вместо этого мы хотим добавить каждый скаляр слева к каждому вектору справа, мы бы сделали это следующим образом:
1 2 3 +"0 1 i. 3 3
1 2 3
5 6 7
9 10 11
Если правым аргументом является только одно число, оно принимается за ранг для всех трех случаев.
Если правым аргументом является глагол, используется его ранг. Например, все они являются производными от одного и того же глагола:
+"0 0 0
+"0 0
+"0
+"+
Если левый аргумент союза ранга является существительным, создается постоянный глагол. Тело этого глагола игнорирует значения любых аргументов и всегда выдает результат, которым является это существительное.
Ссылки
[ редактировать ]- ^ Слепак, Джастин; Шиверс, Олин; Манолиос, Панайотис. «Язык, ориентированный на массивы, со статическим полиморфизмом ранга» (PDF) .
- ^ «Безциклический код I: глаголы имеют ранг» . Jпрограммное обеспечение .
- ^ «Функция Mapcar» . Фонд свободного программного обеспечения .
- ^ Бернеки, Р. (декабрь 1987 г.). «Введение в функциональный ранг» . Материалы конференции APL88, APL Quote Quad . Том. 18.
- ^ «Управление выполнением глагола путем указания ранга» . Jпрограммное обеспечение .
- ^ Рабансер, Стефан; Щур, Александр; Гюннеманн, Стефан (29 ноября 2017 г.). «Введение в тензорные разложения и их применение в машинном обучении». arXiv : 1711.10781 [ stat.ML ].
- ^ кгвгк; набла9; азаг0; том; радарсат1 (24 апреля 2017 г.). «HPTT: высокопроизводительная тензорная транспозиция C++» . Хакерские новости . Y Комбинатор . Проверено 10 декабря 2019 г.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Берк, Крис (12 сентября 2014 г.). «Очерки: Ранг» . Jпрограммное обеспечение .
- Абрамс, PS (февраль 1970 г.). «§II.Е». Машина APL (PDF) . Стэнфордский университет (доктор философии).
- Бэкус, Дж. У., Можно ли программирование освободить от стиля фон Неймана? Функциональный стиль и его алгебра программ ( https://www.thocp.net/biographys/papers/backus_turingaward_lecture.pdf ), Сообщения ACM, том 21, номер 8, 1978-08 гг.; §11.3.3.
- Бернеки, Р.; Айверсон, Кентукки (6–8 октября 1980 г.). «Операторы и закрытые массивы» . Слушания . 1980 г. Встреча пользователей APL. Jпрограммное обеспечение .
- Бернеки, Р.; Айверсон, Кентукки; Макдоннелл, Э.Э.; Мецгер, Р.К.; Шулер, Дж. Х. (2 мая 1983 г.). «SATN 45: Языковые расширения, май 1983 г.» . Jпрограммное обеспечение . ИП Шарп Ассошиэйтс Лимитед.
- Браун, Дж. А., Принципы APL2 ( http://www.softwarepreservation.org/projects/apl/Papers/PRINCIPLESOFAPL2 ), TR 03.247, Лаборатория IBM Санта-Тереза, Сан-Хосе, Калифорния, 1984-03; §20.0.
- Dyalog, Примечания к выпуску Dyalog APL версии 14.0 ( http://www.dyalog.com/dyalog-version-140.htm ), Dyalog Limited, 2015 г.
- Хуэй, RKW, Ранг и единообразие ( http://www.jsoftware.com/papers/rank.htm ), Материалы конференции APL95, APL Quote Quad, Том 25, номер 4, 1995–06.
- Хуэй, RKW, Вспоминая Кена Айверсона ( https://keiapl.org/rhui/remember.htm ), 2004–11.
- Хуэй, RKW, Внутренний продукт — старая/новая проблема ( http://www.jsoftware.com/papers/innerproduct/ip.htm ), Конференция Британской ассоциации APL, 2009 г., 8 июня 2009 г.
- Айверсон, К.Е., Операторы и функции ( http://www.jsoftware.com/papers/opfns.htm ), Отчет об исследовании № RC7091, IBM, 26 апреля 1978 г.
- Айверсон, К.Е., Словарь APL ( http://www.jsoftware.com/papers/APLDictionary.htm ), APL Quote Quad, том 18, номер 1, 1987-09.
- Айверсон, К.Е., Личный взгляд на APL ( http://www.jsoftware.com/papers/APLPersonalView1.htm ), IBM Systems Journal, том 30, номер 4, 1991–12.
- Слепак, Джастин; Шиверс, Олин; Манолиос, Панайотис, массивно-ориентированный язык со статическим ранговым полиморфизмом ( http://www.ccs.neu.edu/home/jrslepak/typed-j.pdf ).