我有以下数据:
a b c d
5 9 6 0
3 1 3 2
第一行是字符,第二行和第三行是数字。
如何根据第 3 行中的数字更改第二行?
例如,第 3 行,如果数字为 3,则第 2 行对应的数字乘以 2,如果第 3 行数字为 1,则将第 2 行的数字加 3:
a b c d
10 12 12 0
3 1 3 2
另外,我如何动态计算这些增加的总和?
Dyalog APL 17.0+
从条件掩码创建一个乘数向量和一个加法向量。
n⌷data
给你第n
th 行一个data
矩阵。
要加倍的第二行的列由以下内容指示:
3=3⌷data
1 0 1 0
所以乘法向量为:
1+3=3⌷data
2 1 2 1
您要添加 3 的第二行的列是:
1=3⌷data
0 1 0 0
所以加法向量为:
3×1=3⌷data
0 3 0 0
因此,新的第二行是:
(3×1=3⌷data)+(1+3=3⌷data)×2⌷data
10 12 12 0
我们可以将其表示为一个二元函数,将第三行作为左参数(控件),第二行作为右参数(实际数据):
Update←{(3×1=⍺)+(1+3=⍺)×⍵}
(3⌷data) Update (2⌷data)
10 12 12 0
现在我们可以使用更新的值创建一个新矩阵:
(3⌷data) Update@2 ⊢data
a b c d
10 12 12 0
3 1 3 2
或者就地更换:
(2⌷data) Update⍨← (3⌷data)
data
a b c d
10 12 12 0
3 1 3 2
请注意,如果您将具有不同角色的数据保存在单独的变量中,您的算法将被简化并且您的代码运行得更快。例如:
(keys values control)←↓data
control Update values
10 12 12 0
values Update⍨← control
values
10 12 12 0
↑keys values control
a b c d
10 12 12 0
3 1 3 2
增加的总和只是新值和原始值之间差异的总和:
+/values-⍨control Update values
14
在 NARS2000 中(我不知道其他 APL 编译器是否也可以),
“⍵[2;],¨⍵[3;]”使 2 行 ⍵、第 n.2 行和第 n 行成对。 3.
f←{(a b)←⍵⋄b=3:2×a⋄b=1:a+3⋄a}
h←{3 4⍴⍵[1;],(f¨⍵[2;],¨⍵[3;]),⍵[3;]}
B←3 4⍴'abcd',5 9 6 0 3 1 3 2
⎕fmt B
┌4───────┐
3 a b c d│
│ 5 9 6 0│
│ 3 1 3 2│
└+───────┘
⎕fmt h B
┌4──────────┐
3 a b c d│
│ 10 12 12 0│
│ 3 1 3 2│
└+──────────┘