2012-01-10 10 views
2

私は2次元配列を持ち、データの列と行を表しています。私は列と行の両方を合計する必要がありますが、私は新しい '要約'行から合計する必要があります。2次元配列 - 合計 'row'と配列の新しい要素として追加

データ(6x5アレイ)

[1, 0, 3, 0, 0], 
[0, 4, 0, 0, 4], 
[0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0] 

ので、結果は7x6アレイ

[1, 0, 3, 0, 0, 4], 
[0, 4, 0, 0, 4, 8], 
[0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0], 
[1, 4, 3, 0, 4, 12] 

なければならない私は

を介して各列を合計し、私の二次元アレイに追加の行を追加することができる知っています
# Sum the columns, add additional one row for summary 
a << a.transpose.map{|x| x.reduce(:+)} 

が、どのように私は追加の列

を追加する

答えて

4

は、配列の各要素を受け取り、それをブロックに渡し、その要素をブロックが返すもので置き換えます。したがって、2次元配列で呼び出すので、rowは元の配列の1次元配列になります。

次に、その行のreduce(:+)で合計を計算します。それから、その行に追加する必要があります。私がここで行ったことは、sumの結果を配列にラップし、+を使用して2つの配列を連結することです。

私もこれを行っている可能性:

a.map! {|row| row << row.reduce(:+) } 
+0

に感謝です!あなたはレイマンズの言葉で短い説明を気にしますか? –

0

私は解決策を考え出した質問をしましたが、私はより良いアプローチがあれば知りたいと。

私のソリューション

# Sum the rows (including the new summary row) 
row_sum = a.map{|x| x.reduce(:+)} 

# transpose the original array, add the summary column as a new row 
c = a.transpose << row_sum 

# transpose it back to the original view, now we have both summary of rows and columns 
c.tranpose 

更新

ここに私の新しい短い答えはヤクブHampl

私が探していたまさに
# Create the summary column (row totals), update the array 
a.map! {|r| r + [r.reduce(:+)]} 

# Create the summary row (column totals) 
a.transpose.map{|x| x + [x.reduce(:+)]}