Rank — это обобщение цикла , используемого в скалярных (не ориентированных на массивы ) языках программирования . [1] [2] Это также обобщение mapcar в языке Lisp [3] и map в современных функциональных языках программирования, а также обобщение скалярного расширения, внутреннего ( матричного ) произведения и внешнего произведения в APL\360. Канонической реализацией rank может быть язык J , но он также доступен в Dyalog APL , техническом стандарте Международной организации по стандартизации (ISO) на Extended APL и NARS2000.
Ранг имеет несколько различных значений. В общем, концепция ранга используется для обработки ортогонального массива в терминах его подмассивов. [4] Например, двумерный массив может рассматриваться в ранге 2 как вся матрица, или в ранге 1 для работы с его неявными одномерными столбцами или строками, или в ранге 0 для работы на уровне его отдельных атомов.
"
) используется для образования глагола с определенным рангом.Понимание ранга требует знания некоторых очень базовых концепций программирования, ориентированных на массивы. В большинстве языков, основанных на массивах, сокращение обозначается косой чертой /
. В J косая черта принимает левый аргумент функции и правый аргумент массива, который должен быть сокращен этой функцией.
+/ 1 2 36
Результат 1 + 2 + 3
, как и ожидалось.
Также можно создать N-мерный целочисленный массив i.
, который принимает вектор целых чисел в качестве аргументов. Количество целых чисел определяет размерность, а абсолютное значение каждого целого числа определяет длину соответствующей размерности.
я . 3 0 1 2 я . 2 3 0 1 2 3 4 5 я 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
Теперь давайте сократим двумерный массив путем сложения.
+/ я . 2 3 3 5 7
Результат 0 1 2 + 3 4 5
, как и ожидалось, равен . Сокращение выполняется по каждому столбцу, суммируя все числа в этом столбце.
Это применение +/
к двумерному массиву соответствует фрагменту кода на языке C: [5]
для ( j = 0 ; j < 3 ; ++ j ) { сумма [ j ] = 0 ; } для ( i = 0 ; i < 2 ; ++ i ) { для ( j = 0 ; j < 3 ; ++ j ) { сумма [ j ] += массив [ i ][ j ]; } }
Предположим, мы хотим сложить элементы каждой строки, как во фрагменте кода на языке C:
для ( i = 0 ; i < 2 ; ++ i ) { сумма [ i ] = 0 ; для ( j = 0 ; j < 3 ; ++ j ) { сумма [ i ] += массив [ i ][ j ]; } }
Чтобы получить результат 3 12
. Мы можем сделать это в J без цикла, просто используя rank.
+/" 1 я . 2 3 3 12
Чтобы еще раз проиллюстрировать, как работает ранг в J, мы можем увидеть, что исходное выражение имеет ранг 2. Оператор сопоставляется с самым высоким рангом массива.
+/" 2 я . 2 3 3 5 7
Обычно этими названиями называют массивы меньшей размерности [6] , хотя иногда они оспариваются. [7]
Существительные в J — это массивы . Ранг существительного — это количество измерений этого массива. Производный глагол #@$
определяет ранг существительного.
Глаголы в J — это функции, которые принимают аргументы-существительные и производят результаты-существительные. Ранг глагола контролирует, как глагол применяется к существительным с рангом больше 0. Этот ранг глагола выражается тремя числами:
−y
использует −
как монадуx−y
использование −
в качестве диадыВо всех случаях есть некое базовое определение глагола, которое применяется к ячейкам , которые являются подмассивами указанного ранга. Или, если аргумент не имеет такого количества измерений, весь аргумент.
В глаголах отрицательный ранг интерпретируется как ранг существительного, предоставленного для этого аргумента, за вычетом указанного значения. (Но никогда не меньше нуля.)
В контексте определенного глагола и определенного существительного измерения этого существительного делятся на последовательность префиксных измерений, называемую рамкой , и последовательность суффиксных измерений, называемых ячейками . Положительные ранги глагола указывают количество измерений ячейки, отрицательные ранги глагола указывают количество измерений рамки.
В диадическом случае есть два фрейма: один для левого аргумента и один для правого аргумента. Эти фреймы должны согласовываться. Если фреймы не идентичны, один должен быть префиксом другого; например, умножает каждый скаляр (нульмерный элемент) слева на каждый вектор (одномерный элемент) справа. Результат оценки этого глагола будет иметь размеры самого длинного фрейма в качестве префиксных размеров его результата. Завершающие размеры результата, если таковые имеются, будут результатом глагола, примененного к соответствующей ячейке(ям). В вырожденных случаях, когда аргументы не имеют достаточных размеров, ранг глагола фактически уменьшается (что повлияет на его результат).(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 я . 3 3 1 3 5 4 6 8 7 9 11
Если вместо этого мы хотим прибавить каждый скаляр слева к каждому вектору справа, мы сделаем это следующим образом:
1 2 3 +" 0 1 я . 3 3 1 2 3 5 6 7 9 10 11
Если правый аргумент представляет собой только одно число, оно принимается за ранг для всех трех случаев.
Если правый аргумент — глагол, используется его ранг. Например, все они образуют один и тот же глагол:
+"0 0 0
+"0 0
+"0
+"+
Если левый аргумент рангового союза является существительным, создается постоянный глагол. Тело этого глагола игнорирует значения любых аргументов и всегда выдает результат, который является этим существительным.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка )