0

我正在研究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

消除双打,但它不起作用。

4

1 回答 1

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)

于 2013-07-08T23:49:29.587 回答