4

我有一个 2x3 数组

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

我想使用 +/ 将所有元素加在一起得到 15。

所以

+/a
5 5 5

嗯。这显然是在添加列。我知道 +/ 等级是 _ _ _ (即无穷大)并且 a 是等级 2。不幸的是,我无法将其转化为想象它为什么要添加列。(我正在阅读“J for C Programmers”)

所以只是为了好玩我做了:

+/"1 a
7 8

所以现在它正在添加行。显然,我将 +/ 的等级更改为 1,它小于 2(a 的等级),这意味着......我不知道。为什么我现在要通过将形式无穷大切换为 1 来添加行?

关于什么

+/"0 a
2 3 2
3 2 3

所以现在我们只是添加一个没有任何内容的单元格,所以我们得到一个等于原始 a 的数组。同样我不知道为什么,虽然我几乎可以通过一个论点来达到这里:动词等级小于(名词)等级,所以我们使用这个值,它是零,所以我们添加 0-cells, IE。我们依次单独添加每个单元格。

再一次祝你好运:

+/"2 a
5 5 5

我再次添加列。我不知道当动词等级发生变化时选择添加哪些行/列/单元格的机制。我们正在添加列,但从我的观点来看,我们可以很容易地添加行。

如果可能的话,我想解释一下。正如我所说,我正在阅读一些文学作品,但我仍然觉得很难。

4

2 回答 2

4

当您有一个 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

然后,直到rank-n 数组(rank n)。

动词的等级

动词的等级是一个稍微不同的故事。这是动词将应用的等级。所以,当你用 box-0 ( <"0) 一个名词时,你总是把这个名词的原子装箱,当你用 box-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每个 rank-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

或者您可以在求和之前解开 ( ,) 数组:

+/,n
276
于 2012-08-24T18:28:28.213 回答
2

短语+/"1and+/似乎作用于矩阵的行和列,但这并不是对它们作用的准确描述,也无助于真正了解等级概念的简单性和强大功能。

让我们从理解这个短语开始+/(我们现在只限于单子形式,即只有一个正确的论点)。该短语由副词组成/,在这种情况下,副词将动词置于其左侧,+并将其插入右侧参数的项目之间。列表/向量的项目是列表中的数字/原子,因此+/ 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

那么秩连词是如何"适应的呢?我发现考虑它的最简单方法是,您可以使用它来控制一次将多少正确参数提供给动词。So+/"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
于 2012-08-26T10:45:18.070 回答