Ранг (язык программирования J) - Rank (J programming language)
Эта статья включает в себя список общих Рекомендации, но он остается в основном непроверенным, потому что ему не хватает соответствующих встроенные цитаты.Июль 2018 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Классифицировать является обобщением зацикливание как используется в скалярных (не-множество -ориентированный) языки программирования.[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. Этот ранг глагола выражается тремя числами:
- Ранг для случая монады; Например,
−y
использует−
как монада - Ранг для левого аргумента в случае диады; Например,
х-у
использует−
как диада - Ранг за правильный аргумент в случае диады
Во всех случаях есть какое-то основное определение глагола, которое применяется к клетки, которые являются подмассивами указанного ранга. Или, если аргумент не имеет такого большого количества измерений, весь аргумент.
В глаголах отрицательный ранг интерпретируется как ранг существительного, указанного для этого аргумента, за вычетом указанного значения. (Но никогда не меньше нуля.)
- Например, глагол с монадическим рангом отрицательного, когда ему задан аргумент ранга 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* +"+
Если левый аргумент соединения рангов - существительное, создается постоянный глагол. Тело этого глагола игнорирует значения любых аргументов и всегда дает результат, который является существительным.
Рекомендации
- ^ Слепак, Джастин; Дрожь, Олин; Манолиос, Панайотис. «Массив-ориентированный язык со статическим ранговым полиморфизмом» (PDF).
- ^ "Код без петель I: глаголы имеют ранг". Jsoftware.
- ^ "Функция mapcar". Фонд свободного программного обеспечения.
- ^ Бернецки Р. (декабрь 1987 г.). «Введение в ранг функции». APL88 Conference Proceedings, APL Quote Quad. 18.
- ^ «Управление исполнением глагола путем определения ранга». Jsoftware.
- ^ Рабансер, Стефан; Щур Александр; Гюннеманн, Стефан (29.11.2017). «Введение в тензорные декомпозиции и их приложения в машинном обучении». arXiv:1711.10781 [stat.ML ].
- ^ kgwgk; nabla9; azag0; мне; radarsat1 (24.04.2017). "HPTT: высокопроизводительная тензорная транспозиция C ++". Хакерские новости. Y комбинатор. Получено 2019-12-10.
- ^ Берк, Крис (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 ).