diff options
author | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-20 02:18:34 +0000 |
---|---|---|
committer | marcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-20 02:18:34 +0000 |
commit | 980c0dd360b5454d49df47e08b8708ff888ae7a4 (patch) | |
tree | cdc0bb0ed3b9ccf04e35ca55f7829510c86a00c4 /lib | |
parent | 62646c8d673b6dd67dba008afdcb5ff1c2eb3614 (diff) |
lib/matrix: Add Matrix{.|#}combine
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60859 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r-- | lib/matrix.rb | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/matrix.rb b/lib/matrix.rb index 0a2b609b59..2f2d0f371a 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -250,6 +250,35 @@ class Matrix end # + # Create a matrix by combining matrices entrywise, using the given block + # + # x = Matrix[[6, 6], [4, 4]] + # y = Matrix[[1, 2], [3, 4]] + # Matrix.combine(x, y) {|a, b| a - b} # => Matrix[[5, 4], [1, 2]] + # + def Matrix.combine(*matrices) + return to_enum(__method__, *matrices) unless block_given? + + return Matrix.empty if matrices.empty? + matrices.map!(&CoercionHelper.method(:coerce_to_matrix)) + x = matrices.first + matrices.each do |m| + Matrix.Raise ErrDimensionMismatch unless x.row_count == m.row_count && x.column_count == m.column_count + end + + rows = Array.new(x.row_count) do |i| + Array.new(x.column_count) do |j| + yield matrices.map{|m| m[i,j]} + end + end + new rows, x.column_count + end + + def combine(*matrices, &block) + Matrix.combine(self, *matrices, &block) + end + + # # Matrix.new is private; use Matrix.rows, columns, [], etc... to create. # def initialize(rows, column_count = rows[0].size) |