如何动态计算增加的​​总和?

how to dynamically calculate sum of increases?

我有以下数据:

a b c d
5 9 6 0
3 1 3 2

第一行字符,第二行和第三行数字。

如何根据第 3 行中的数字更改第二行?

例如第3行,如果数字是3,则第2行对应的数字乘以2,如果第3行数字是1,则第3行的数字加3 2:

a  b  c  d
10 12 12 0
3  1  3  2

另外,如何动态计算这些增加的总和?

Dyalog APL 17.0+

根据条件掩码创建一个乘法向量和一个加法向量。

n⌷data 获取 n 矩阵的第 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

我们可以将其表示为一个二元函数,将第 3 行作为左参数(控制),将第二行作为右参数(实际数据):

      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

Try it online!


请注意,如果您将具有不同角色的数据保存在单独的变量中,您的算法会得到简化,您的代码 运行 会更快。例如:

      (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

Try it online!


增加的总和就是新值与原值之差的总和:

      +/values-⍨control Update values
14

Try it online!

在 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│
└+──────────┘