20071


（概念的には）以下のように、2次元配列で行列を表現したとします。

[code]

    [ [1,2,3], [4,5,6] ..... [n-2,n-1,n] ]
    
[/code]

これを

[code]

    [(1+4+...+n-2), (2+5+...+n-1), (3+6+...+n)]
    
[/code]

という具合に変換したいと思ってます。  
`ruby`でスマートにやるとしたらどういう方法がありますでしょうか？

何とか再帰を使って解いてみましたが、ここまでやらなくても解ける方法があったら教えてもらえると嬉しいです。

[code]

    def aaa(arr)
      if arr.size == 1
        arr
      elsif arr.size == 2
        bbb(arr[0],arr[1])
      else
        bbb(arr[0], aaa(arr[1..-1]))
      end
    end
    
    def bbb(arr1,arr2)
      ret = Array.new(arr1.size, 0)
      arr1.size.times{|n| ret[n] += arr1[n] + arr2[n]}
      ret
    end
    
    実行例：
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
    aaa(a)
    => [22, 26, 30]
    
[/code]


CC BY-SA 3.0
2015-12-16T10:16:00.337
20068
2015-12-17T02:51:40.490
2015-12-16T19:03:25.013
9403
9403
question
ruby
2次元配列で表現した行列で列ごとの合計値を算出したい

[code]

    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
    a.transpose.map { |n| n.inject(:+) }
    # => [22, 26, 30]
    
[/code]

このような方法があります。いかがでしょうか？


CC BY-SA 3.0
2015-12-16T11:30:48.263
20071
2015-12-16T11:30:48.263
2646
20068
answer


行（列）ベクトルの和と考えた場合です。

[code]

    require 'matrix'
    
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
    p a.map {|x| Vector.elements(x)}.reduce {|accum,x| accum+x}.to_a
    
[/code]


CC BY-SA 3.0
2015-12-16T11:58:34.643
20074
2015-12-17T00:30:05.653
2015-12-17T00:30:05.653
13199
13199
20068
answer


`active_support`を使っていいのであれば `Enumerable#sum`が定義されてますので

[code]

    require 'active_support'
    require 'active_support/core_ext'
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
    a.transpose.map{|array| array.sum}
    => [22, 26, 30]
    
[/code]

とできます。またブロックでそれぞれの要素の特定のメソッドの返り値を取りたい時は以下のような記述ができます。

[code]

    a.transpose.map(&:sum)
    => [22, 26, 30]
    
[/code]


CC BY-SA 3.0
2015-12-16T19:15:54.097
20088
2015-12-16T19:15:54.097
3271
20068
answer


安心してください。それ、NArray でできますよ。

配列を色々とゴニョゴニョしたいなら NArray が便利です。  
以下のスライドで私は救われました。  
[それ NArray でできるよ](https://speakerdeck.com/tmaedax/sore-narray-dedekiruyo)

[code]

    require 'narray'
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
    NArray.to_na(a).sum(1) # => [ 22, 26, 30 ]
    
[/code]


CC BY-SA 3.0
2015-12-17T02:51:40.490
20092
2015-12-17T02:51:40.490
7208
20068
answer