LoginSignup
6
2

More than 5 years have passed since last update.

Ruby : 複数配列の要素ごとに演算する

Posted at

割と悩んだので。
ベクトル和的なことやりたいとき

arr1 = [1, 2, 3]
arr2 = [4, 5, 6]

[arr1, arr2].transpose.map { |ele| ele.inject(:+) }
# => [5, 7, 9]

transpose

配列縦に並べていって列要素ごとに新しい配列返す
配列の長さ違うとエラーになるのでzipにする

[[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose
# [1, 2, 3]
# [4, 5, 6]
# [7, 8, 9]
# 列要素ごとに新しい配列返す
# => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

# これはエラー
[[1, 2, 3], [4, 5]].transpose

inject

最初の要素と次の要素に対してメソッド実行、戻り値とその次の要素でメソッド実行、・・・で最後に結果返す
初期値指定もできる

# 初期値なし
[1, 2, 3, 4].inject(:+)
# 1 + 2 => 3
# 3 + 3 => 6
# 6 + 4 => 10
# => 10

# 初期値あり
[1, 2, 3, 4].inject(5, :+)
# 5 + 1  => 6
# 6 + 2  => 8
# 8 + 3  => 11
# 11 + 4 => 15
# => 15

最初のやつは

arr1 = [1, 2, 3]
arr2 = [4, 5, 6]

[arr1, arr2].transpose.map { |ele| ele.inject(:+) }

# transpose実行後
# [[1, 4], [2, 5], [3, 6]].map { |ele| ele.inject(:+) }
#
# mapで以下が実行されて戻り値が配列に格納される
# [1, 4].inject(:+)
# [2, 5].inject(:+)
# [3, 6].inject(:+)
# => [5, 7, 9]
6
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2