J Глагол Ранг и дополнение

У меня есть массив 2x3

a =. 2 3 $  2 3
   a
2 3 2
3 2 3

И я хочу сложить все элементы вместе, используя +/, чтобы получить 15.

So

+/a
5 5 5

Хм. Это явное добавление столбцов. Я знаю, что +/rank равен _ _ _ (т. е. бесконечность), а a — это ранг 2. К сожалению, я не могу представить, почему он добавляет столбцы. (Я читаю "J для программистов C")

Так что просто для удовольствия я сделал:

+/"1 a
7 8

Итак, теперь он добавляет строки. Очевидно, я изменил ранг +/ на 1, что меньше 2 (ранг a), что означает... Я не знаю. Почему теперь я добавляю строки, переключая бесконечность формы на 1?

Что о

+/"0 a
2 3 2
3 2 3

Итак, теперь мы просто добавляем отдельные ячейки без ничего, чтобы получить массив, равный исходному a. Опять же, я не знаю, почему, хотя я могу почти запутаться в аргументе, чтобы добраться сюда: ранг глагола меньше, чем ранг (существительного), поэтому мы используем это значение, равное нулю, поэтому мы добавляем 0-ячеек, т.е. добавляем каждую ячейку по очереди индивидуально.

И еще раз на удачу:

+/"2 a
5 5 5

И я снова добавляю столбцы. Я не знаю механизма, который выбирает, какие строки/столбцы/ячейки добавляются при изменении ранга глагола. Мы добавляем столбцы, но, с моей точки зрения, мы могли бы так же легко добавлять строки.

Я хотел бы, чтобы это объяснили, если это возможно. Как я уже сказал, я читаю кое-какую литературу, но мне все еще тяжело.


person Community    schedule 24.08.2012    source источник


Ответы (2)


Когда у вас есть n-массив, вы можете получить доступ к каждому «уровню» вложенности, используя соответствующий ранг.

Ранги/формы СУЩЕСТВИТЕЛЬНОГО

Сначала у вас есть атомы (ранг 0):

a =: 1

их форма ($a) пуста.

Затем у вас есть списки (ранг 1), которые представляют собой просто несколько соединенных вместе атомов:

b =: a,a,a
b =: 3 # a
b =: 3 $ a

их форма ($b) равна длине списка.

$b
3

Затем таблицы (ранг 2): составленные списки (сшитые или иначе):

c =: b,.b,.b

их форма представляет собой список из 2 элементов: строки, столбцы.

$c
3 3

Затем до массива ранга n (ранг n).

Ранг ГЛАГОЛ

Несколько иная история с рангом глагола. Это ранг, к которому будет применяться глагол. Таким образом, когда вы упаковываете 0 (<"0) существительное, вы всегда упаковываете атомы этого существительного, когда вы упаковываете-1 (<"1), вы всегда упаковываете списки существительного и т. д. Например:

 ]n =: 2 3 4 $ i.24
 0  1  2  3
 4  5  6  7
 8  9 10 11

12 13 14 15
16 17 18 19
20 21 22 23

0-ранг:

<"0 n
┌──┬──┬──┬──┐
│0 │1 │2 │3 │
├──┼──┼──┼──┤
│4 │5 │6 │7 │
├──┼──┼──┼──┤
│8 │9 │10│11│
└──┴──┴──┴──┘

┌──┬──┬──┬──┐
│12│13│14│15│
├──┼──┼──┼──┤
│16│17│18│19│
├──┼──┼──┼──┤
│20│21│22│23│
└──┴──┴──┴──┘

1-ранг:

  <"1 n
┌───────────┬───────────┬───────────┐
│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-ранг:

 <"2 n
┌─────────┬───────────┐
│0 1  2  3│12 13 14 15│
│4 5  6  7│16 17 18 19│
│8 9 10 11│20 21 22 23│
└─────────┴───────────┘

3 ранг:

 <"3 n
┌───────────┐
│ 0  1  2  3│
│ 4  5  6  7│
│ 8  9 10 11│
│           │
│12 13 14 15│
│16 17 18 19│
│20 21 22 23│
└───────────┘

В этом примере ранги выше 3 равны 3.

Кстати, вы также можете использовать отрицательные ранги, которые отсчитываются в обратном порядке от самого высокого ранга.

Вы также можете смешивать ранги.

Подведение итогов

Теперь вы видите, как изменение ранга +/ меняет результат суммирования. Например, +/"1 суммирует каждый список ранга 1:

    <"1 n
┌───────────┬───────────┬───────────┐
│0 1 2 3    │4 5 6 7    │8 9 10 11  │
├───────────┼───────────┼───────────┤
│12 13 14 15│16 17 18 19│20 21 22 23│
└───────────┴───────────┴───────────┘
   +/"1 n
 6 22 38
54 70 86

Чтобы суммировать массив ранга n, вы должны выполнить n +/s:

(+/^:3) n
276
+/+/+/ n
276

или вы можете распутать (,) массив перед суммированием:

+/,n
276
person Eelvex    schedule 24.08.2012
comment
+1 за равель. Использование ravel, безусловно, является разумным подходом. В качестве альтернативы матричная функция суммирования может быть разработана как sumall =: 13 : '+/^:(#$y)y'. Тем не менее, это должно превзойти Ravel. - person MPelletier; 27.08.2012

Фразы +/"1 и +/, по-видимому, воздействуют на строки и столбцы матрицы, но это не точное описание того, что они делают, и не помогает по-настоящему понять простоту и силу концепции ранга.

Начнем с понимания фразы +/ (мы пока ограничимся монадической формой, т.е. только правильным аргументом). Эта фраза состоит из наречия /, которое переводит глагол слева, в данном случае +, и вставляет его между элементами правого аргумента. Элементы списка/вектора — это числа/атомы в списке, поэтому +/ 3 4 5 6 на самом деле просто сокращение для 3 + 4 + 5 + 6. Элементами таблицы/матрицы (ранг 2) являются ее строки (ранг 1), а элементами массива ранга 3 являются ее таблицы (ранг 2).

   ]a=: i. 2 3
0 1 2         NB. 1st item of a
3 4 5         NB. 2nd item of a

   ]b=: i. 2 3 4 
 0  1  2  3
 4  5  6  7   NB. 1st item of b
 8  9 10 11

12 13 14 15
16 17 18 19   NB. 2nd item of b
20 21 22 23

Помните, что +/ вставляет + между элементами своего правого аргумента, поэтому:

   +/ i. 2 3
3 5 7   

По сути просто:

   0 1 2 + 3 4 5
3 5 7

И:

   +/ i. 2 3 4
12 14 16 18
20 22 24 26
28 30 32 34

просто складывает две матрицы вместе

   (i. 3 4) + (12 + i. 3 4)
12 14 16 18
20 22 24 26
28 30 32 34

Так как же вписывается ранговая конъюнкция "? Я считаю, что самый простой способ думать об этом состоит в том, что вы можете использовать его, чтобы контролировать, насколько большой кусок правильного аргумента передается глаголу за раз. Таким образом, +/"1 совпадает с +/, но любой правильный аргумент будет передаваться только +/ списку/вектору/строке за раз. Так:

   +/"1 i. 2 3

передает матрицу с i. 2 3 по +/ построчно. Затем +/ вставит + между элементами строки, оценит выражение и затем перейдет к следующему фрагменту, добавляя результаты для каждого фрагмента вместе по мере продвижения. Другими словами, фактический расчет выглядит примерно так

   +/"1 i. 2 3 -->
   (+/ 0 1 2) , (+/ 3 4 5) -->
   (0 + 1 + 2) , (3 + 4 + 5)
3 12

   +/"1 i. 2 3 4   NB. Feed right arg to +/ a row-at-a-time
 6 22 38           NB. + inserted between items of each row
54 70 86           NB. result has row for each item (matrix) in original argument

   +/"2 i. 2 3 4   NB. feed right arg to +/ a table/matrix-at-a-time
12 15 18 21        NB. + inserted between rows of each matrix
48 51 54 57

   +/"0 i. 2 3 4   NB. feed right arg to +/ an atom at a time
0  1  2  3         NB. this is essentially an identity function because
4  5  6  7         NB. the sum of a number is itself: (+/ 3) is just 3.
8  9 10 11

12 13 14 15
16 17 18 19
20 21 22 23
person Tikkanz    schedule 26.08.2012