【问题标题】:how to dynamically calculate sum of increases?如何动态计算增加的​​总和?
【发布时间】:2020-07-03 00:04:37
【问题描述】:

我有以下数据:

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+

【问题讨论】:

  • 我有一些问题 1. 如果数字既不是 1 也不是 3 怎么办? 2.在输出中你想要什么?更新第二行或值增加了? 3. 17+在这里是什么意思?
  • 如果数字不是 1 也不是 3,则无需执行任何操作。在输出中只需要打印带有更改数字且未更改的 upd 行。我想看看第二行增加的数字
  • @AbhaySehgal 我已经澄清,“17+”是指Dyalog APL 17.0 或更高版本。
  • @cickness 您可能有兴趣经常光顾the Stack Exchange APL chat room,在这里您可以找到初学者和专家级 APL。

标签: matrix apl dyalog


【解决方案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

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!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2021-07-03
      • 2017-04-18
      相关资源
      最近更新 更多