我正在研究J。
如何转换此矩阵:
(i.10)*/(i.10)
0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
0 2 4 6 8 10 12 14 16 18
0 3 6 9 12 15 18 21 24 27
0 4 8 12 16 20 24 28 32 36
0 5 10 15 20 25 30 35 40 45
0 6 12 18 24 30 36 42 48 54
0 7 14 21 28 35 42 49 56 63
0 8 16 24 32 40 48 56 64 72
0 9 18 27 36 45 54 63 72 81
在数组中?
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 . . .
我试过
(i.10)*/(i.10)"0
然后我添加了
~.(i.10)*/(i.10)"0
消除双打,但不起作用。
答案 0 :(得分:2)
如果要将二维表(矩阵)转换为一维列表(向量或“数组”,尽管在J世界中“数组”通常表示“具有任意数量[N]的维度的矩形” ),你可以使用ravel(,
):
matrix =: (i.10)*/(i.10)
list =: , matrix
list
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 ...
现在使用nub(〜。)删除重复项应该有效:
~. list
0 1 2 3 4 5 6 7 8 9 10 12 ...
请注意,在J中的,数组的形状通常带有重要信息,因此像这样展平矩阵是相当不寻常的。但是,没有什么能阻止你。
顺便说一句,你可以通过使用副词~
来节省一些击键,副词也会将二元组的左侧参数复制到右侧,所以你可以这样说:
matrix =: */~ i. 10
并获得与(i.10) */ (i.10)
相同的结果。