2010-06-10 7 views
1

J'ai un tableau de tableaux en deux dimensions. Je veux créer un nouveau tableau bidimensionnel qui trouve la somme de ces valeurs dans les tableaux 2D.Trouver la somme des tableaux 2D en Ruby

Somme à x, y de nouveau tableau = Somme à x, y arr1 + Somme à 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| 

Adding les deux tableaux ci-dessus dimensions se traduira par ,

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

Comment y parvenir en Ruby (pas dans d'autres langues). J'ai écrit une méthode, mais elle a l'air très longue et moche.

Répondre

5
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]] 

Ou, si vous voulez le même format que dans la réponse de @ Jeriko, à savoir un retour Array au lieu d'un 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]] 
+0

Doux !! Merci Jorg! – bragboy

2

En supposant que chaque tableau a les mêmes dimensions, vous pouvez utiliser le code suivant: (laissez-moi savoir si vous voulez tout cela expliqué)

# 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]] 

Hope this helps!

+0

Merci Jerkio! – bragboy