2013-07-20 2 views
4

В J, у меня есть список, как 1 2 3, я хочу взять *: и 2*, чтобы сделать его структуру коробки, каккак сделать следующие коробочные данные из списка

┌─┬─┐ 
│1│2│ 
│4│4│ 
│9│6│ 
└─┴─┘ 

или даже

┌───┐ 
│1 2│ 
├───┤ 
│4 4│ 
├───┤ 
│9 6│ 
└───┘ 

Как это сделать? Я бы очень признателен вам за вашу помощь.

ответ

1

Необходимо добавить evoke a gerund в режиме добавления (:0).

a =: 1 2 3 
*:`+: (`:0) a 
1 4 9 
2 4 6 

Если вам нужно боксировали, просто ;/ их:

;/*:`+: (`:0) a 
┌─────┬─────┐ 
│1 4 9│2 4 6│ 
└─────┴─────┘ 
;/ |: *:`+: (`:0) a  NB. different axis 
┌───┬───┬───┐ 
│1 2│4 4│9 6│ 
└───┴───┴───┘ 
_3 <\6 1 $,*:`+: (`:0) a NB. yet another axis 
┌─┬─┐ 
│1│2│ 
│4│4│ 
│9│6│ 
└─┴─┘ 
+0

могли бы вы объяснить немного о '_3 <\ 6 1 $,' часть ? –

+0

'6 1 $ y' означает« сделать массив размером 6 на 1 из y ». '_3 f \ y' означает« split y в 3s и применить f к каждому расколу ». – Eelvex

1

Если вы хотите вертикальный (колонок-ориентированный) выход, вы должны сначала преобразовать список в вертикальный формат (колонок-ориентированный):

,.1 2 3 
1 
2 
3 

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

(*: ; 2&*) ,. 1 2 3 

Две ноты:

  • Это необычно, и нет необходимости, в J, чтобы использовать ящики, когда все данные того же типа и формы. В вашем случае обе ваши операции являются скалярными и числовыми, поэтому оба глагола будут генерировать столбец чисел 1x3. Было бы более типичным и идиоматичным объединять их с ,., чтобы получить таблицу цифр 2x3, чем ;, чтобы получить 2 непрозрачных короба.

  • "Double" уже примитив в J, поэтому вместо 2&*, мы могли бы сказать +: как в (*: ; +:) ,. 1 2 3