Нахождение суммы 2D массивов в Ruby - PullRequest
1 голос
/ 10 июня 2010

У меня есть массив двумерных массивов. Я хочу создать новый двумерный массив, который находит сумму этих значений в двумерных массивах.

Сумма в x, y нового массива = Сумма в x, y arr1 + Сумма в x, y arr2 + ....

|1,2,4| |1,1,1| |1,1,1| 
|2,4,6| |1,1,1| |1,1,1| 
|2,4,6| |1,1,1| |1,1,1| 
|2,4,6| |1,1,1| |1,1,1| 

Теперь добавление вышеуказанных двухмерных массивов приведет к,

|3,4,6|
|4,6,8|
|4,6,8|
|4,6,8|

Как добиться этого в Ruby (не на других языках). Я написал метод, но он выглядит очень длинным и безобразным.

Ответы [ 2 ]

5 голосов
/ 10 июня 2010
require 'matrix'

Matrix[
  [1, 2, 4],
  [2, 4, 6],
  [2, 4, 6],
  [2, 4, 6]
] +

Matrix[
  [1, 1, 1],
  [1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]
] +

Matrix[
  [1, 1, 1],
  [1, 1, 1],
  [1, 1, 1],
  [1, 1, 1]
]

# => Matrix[[3, 4, 6], [4, 6, 8], [4, 6, 8], [4, 6, 8]]

Или, если вы хотите использовать тот же формат, что и в ответе @ Jeriko, то есть вернуть Array вместо Matrix:

def sum_arrays(*a)
  return *a.map {|m| Matrix[*m] }.reduce(:+)
end

# data you supplied:
x = [[1, 2, 4], [2, 4, 6], [2, 4, 6], [2, 4, 6]]
y = [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]
z = [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]]

p sum_arrays(x, y, z)
# => [[3, 4, 6], [4, 6, 8], [4, 6, 8], [4, 6, 8]]
2 голосов
/ 10 июня 2010

Предполагая, что каждый массив имеет одинаковые размеры, вы можете использовать следующий код: (дайте мне знать, если вы хотите объяснить что-либо из этого)

# returns an array 
# where each element (x,y) 
# is the sum of all elements (x,y) from an arbitrary number of arrays

def sum_arrays *a
  arr = []
  a[0].each_index do |r|       # iterate through rows
    row = []
    a[0][r].each_index do |c|  # iterate through columns
      # get sum at these co-ordinates, and add to new row
      row << a.inject(0) { |sum,e| sum += e[r][c] }
    end
    arr << row  # add this row to new array
  end
  arr # return new array
end

# data you supplied:
x = [[1,2,4],[2,4,6],[2,4,6],[2,4,6]]
y = [[1,1,1],[1,1,1],[1,1,1],[1,1,1]]
z = [[1,1,1],[1,1,1],[1,1,1],[1,1,1]]       

print sum_arrays x,y,z
# => [[3,4,6],[4,6,8],[4,6,8],[4,6,8]]

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...