我有一个2x3阵列
a =. 2 3 $ 2 3
a
2 3 2
3 2 3
我想用+ /将所有元素加在一起得到15。
所以
+/a
5 5 5
嗯。这显然是在添加列。我知道+ / rank是_ _ _(即无穷大)而a是2级。不幸的是,我无法将其转化为想象为什么它会添加列。 (我正在阅读“J for C Programmers”)
所以我只是为了好玩而做了:
+/"1 a
7 8
所以现在它正在添加行。很显然,我将+ /的等级改为1,小于2(等级为a),这意味着......我不知道。为什么我现在通过将无限形式切换为1来添加行?
怎么样?
+/"0 a
2 3 2
3 2 3
所以现在我们只是添加单个单元格,所以我们得到一个等于原始a的数组。再一次,我不知道为什么,虽然我可以简单地讨论到这里:动词等级小于a(名词)等级,所以我们使用这个值,这是零,所以我们添加0个单元格,即。我们依次单独添加每个单元格。
再一次好运:
+/"2 a
5 5 5
我再次添加列。我不知道在动词排名发生变化时选择添加哪些行/列/单元格的机制。我们正在添加列,但形成了我的观点,我们可以轻松地添加行。
如果可能,我想解释一下。正如我所说,我正在阅读一些文献,但我仍然觉得很难。
答案 0 :(得分:4)
当你有一个n阵列时,你可以使用适当的等级访问每个嵌套“级别”。
首先你有原子(等级0):
a =: 1
他们的形状($a
)是空的。
然后你有列表(排名1),它们只是放在一起的一些原子:
b =: a,a,a
b =: 3 # a
b =: 3 $ a
它们的形状($b
)是列表的长度。
$b
3
然后,表格(排名2):列在一起的列表(stiched或其他):
c =: b,.b,.b
他们的形状是2项目列表:行,列。
$c
3 3
然后,最多 rank-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
要对rank-n数组求和,您必须执行n +/
s:
(+/^:3) n
276
+/+/+/ n
276
或者你可以在求和之前对数组进行ravel(,
):
+/,n
276
答案 1 :(得分:2)
短语+/"1
和+/
似乎会对矩阵的行和列起作用,但这并不能准确描述它们的作用,也无法真正了解矩阵的含义。排名概念的简单性和力量。
让我们从理解短语+/
开始(我们现在将自己局限于monadic形式,即只有正确的论点)。这个短语由副词/
组成,它将动词放在左边,在本例中为+
,并将其插入到右边参数的项目之间。列表/向量的项是列表中的数字/原子,因此+/ 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