stringtranslate.com

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

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. Этот ранг глагола выражается тремя числами:

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

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

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

Например, глагол с монадическим рангом отрицательный единица, когда ему дан аргумент ранга 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 я . 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             

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

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

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

Ссылки

  1. ^ Слепак, Джастин; Шиверс, Олин; Манолиос, Панайотис. «Язык, ориентированный на массивы, со статическим полиморфизмом ранга» (PDF) .
  2. ^ "Код без циклов I: Глаголы имеют ранг". Jsoftware .
  3. ^ "Функция mapcar". Free Software Foundation .
  4. ^ Бернеки, Р. (декабрь 1987 г.). «Введение в ранг функций». Труды конференции APL88, APL Quote Quad . Том 18.
  5. ^ «Управление выполнением глагола путем указания ранга». Jsoftware .
  6. ^ Рабансер, Стефан; Щур, Александр; Гюннеманн, Стефан (2017-11-29). «Введение в тензорные разложения и их применение в машинном обучении». arXiv : 1711.10781 [stat.ML].
  7. ^ kgwgk; nabla9; azag0; tome; radarsat1 (2017-04-24). "HPTT: Высокопроизводительная транспозиция тензоров C++". Hacker News . Y Combinator . Получено 2019-12-10 .{{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  8. ^ Берк, Крис (2014-09-12). "Эссе: Ранг". Jsoftware .

Внешние ссылки