APL2, сожми каждый - PullRequest
       18

APL2, сожми каждый

0 голосов
/ 06 декабря 2018

Я хочу сжать несколько векторов / матриц одновременно.

Вот мои данные:

txt←(3 3⍴'a')(3 3⍴'b')(3 3⍴'c')(3 3⍴'d')
  b←(0 1 0)(1 1 1)(1 1 0)(0 0 0)

Теперь я хочу сжать каждую матрицу в txtпо соответствующему логическому вектору в b:

b⌿¨txt

Вот что я ожидаю получить назад:

┌───┬───┬───┬───┐
│aaa│bbb│ccc│   │
│   │bbb│ccc│   │
│   │bbb│   │   │
└───┴───┴───┴───┘

Я пробовал это на tryapl.org и ведет себя как я ожидаю, но в APL2 я получаю ОШИБКА ДОМЕНА , указывающая на b и каждый глиф.

Есть ли здесь хакеры APL2, которые могли бы помочь мне в этом?Есть ли другой способ сделать это без явного цикла?Внутренний / Внешний продукт?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

В GNU APL (производная от APL2) вы можете заключить круглые скобки в ⌿ или около ⌿¨:

      txt←(3 3⍴'a')(3 3⍴'b')(3 3⍴'c')(3 3⍴'d')
        b←(0 1 0)(1 1 1)(1 1 0)(0 0 0)

      b(⌿)¨txt
 aaa  bbb  ccc   
      bbb  ccc   
      bbb     

      b(⌿¨)txt
 aaa  bbb  ccc   
      bbb  ccc   
      bbb        

В оригинальном IBM APL2 (версия для ПК), похоже, ничего из этого не работает.Причины могут заключаться в том, что ⌿ является неоднозначным (это может означать «сжатие функций», а также «сокращение операторов»), а стандарт ISO (который реализуется как IBM APL2, так и GNU APL) не говорит, как устранить эту неоднозначность.Скобки заставляют ¨ принимать ⌿ как функцию.

0 голосов
/ 06 декабря 2018

Причина, по которой это не удается в APL2, заключается в том, что является чисто оператором в APL2, тогда как в Dyalog APL это гибридная функция / оператор в том смысле, что он действует как функция, если у него есть массив слева, но какоператор, если слева от него есть функция.

В Dyalog APL, поскольку действует как нормальная функция, элементы b и txt будут спарены на ¨ каквы ожидаете.

В APL2 b будет привязан к монадическому оператору в качестве единственного операнда, а затем вся производная функция b⌿ будет применена с ¨ к каждому элементуtxt.Излишне говорить, что весь b (вектор векторов) не является подходящим левым аргументом для одного приложения .

Вы можете обойти эту проблему, обернув в функциюи затем с помощью ¨ для этой функции-оболочки.Обертка так же просто, как:

r←x R y
r←x⌿y
...