1

我有以下数据:

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+

4

2 回答 2

1

从条件掩码创建一个乘数向量和一个加法向量。

n⌷data给你第nth 行一个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

在线尝试!

于 2020-02-23T12:48:32.603 回答
0

在 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│
└+──────────┘
于 2020-07-02T16:04:37.003 回答