как динамически рассчитать сумму прироста? - PullRequest
1 голос
/ 23 февраля 2020

У меня есть следующие данные:

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

Символы в первом ряду, числа во 2-м и 3-м рядах.

Как изменить второй ряд в зависимости от чисел в строка 3?

Например, в 3-й строке, если число равно 3, соответствующее число в строке 2 умножается на 2, а если в 3-й строке число равно 1, то добавьте 3 к число в строке 2:

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

Кроме того, как я могу динамически рассчитать сумму этих увеличений?

Dyalog APL 17,0 +

1 Ответ

1 голос
/ 23 февраля 2020

Создайте вектор множителя и вектор сложения из масок условий.

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

Мы можем express это как диади c функция, принимающая 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

Попробуйте онлайн!


Обратите внимание, что ваши алгоритмы будут упрощены и ваш код будет работать быстрее, если вы храните данные с разными ролями в отдельных переменных. Например:

      (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

Попробуйте онлайн!

...