require 'matrix'
(Vector.elements(num_defect) - Vector.elements(num_fixes) -
Vector.elements(num_blocks) - Vector.elements(num_ext_defects)).to_a
#=> [28, 29, 17, 18, 13, 12, 0, 2]
При этом используются методы Vector :: elements и Vector # to_a .Можно написать Vector[*arr]
вместо Vector.elements(arr)
, используя Vector :: [] .
Если num_defect
должен быть мутирован, вы можете написать num_defect.replace(<above expression>)
.Если бы
arr = [num_defect, num_fixes, num_blocks, num_ext_defects]
#=> [[30, 30, 20, 20, 18, 18, 5, 5],
# [ 1, 0, 3, 2, 1, 2, 2, 2],
# [ 0, 0, 0, 0, 2, 2, 1, 0],
# [ 1, 1, 0, 0, 2, 2, 2, 1]]
можно было бы использовать матричное умножение:
(Matrix.row_vector([1, *[-1]*(arr.size-1)]) * Matrix.rows(arr)).to_a.first
#=> [28, 29, 17, 18, 13, 12, 0, 2]
, где
[1, *[-1]*(arr.size-1)]
#=> [1, -1, -1, -1]
Это было бы удобно и относительно вычислительно эффективно, если бы arr
имелбольшее количество элементов, чем в примере.
При этом используются методы Matrix Matrix :: row_vector , Matrix :: lines и Matrix # to_a .Можно написать Matrix[*arr]
вместо Matrix.rows(arr)
, используя Matrix :: [] .Однако одно из преимуществ использования rows
заключается в том, что можно добавить аргумент false
(Matrix.rows(arr, false)
), чтобы избежать копирования элементов arr
при создании объекта Matrix
.