From 56d5728589f9cfea6e1d923d5faab8f1b982d29d Mon Sep 17 00:00:00 2001 From: marcandre Date: Tue, 7 Oct 2014 19:30:48 +0000 Subject: * lib/matrix.rb: Add Matrix#laplace_expansion. patch by gogo tanaka [#10073] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/matrix.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'lib/matrix.rb') diff --git a/lib/matrix.rb b/lib/matrix.rb index 054c197b52..b56b12819a 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -62,6 +62,8 @@ end # * #minor(*param) # * #first_minor(row, column) # * #cofactor(row, column) +# * #laplace_expansion(row_or_column: num) +# * #cofactor_expansion(row_or_column: num) # # Properties of a matrix: # * #diagonal? @@ -685,6 +687,37 @@ class Matrix det_of_minor * (-1) ** (row + column) end + # + # Returns the Laplace expansion along given row or column. + # + # Matrix[[7,6], [3,9]].laplace_expansion(column: 1) + # => 45 + # + # Matrix[[Vector[1, 0], Vector[0, 1]], [2, 3]].laplace_expansion(row: 0) + # => Vector[3, -2] + # + # + def laplace_expansion(row: nil, column: nil) + num = row || column + + if !num || (row && column) + raise ArgumentError, "exactly one the row or column arguments must be specified" + end + + Matrix.Raise ErrDimensionMismatch unless square? + raise RuntimeError, "laplace_expansion of empty matrix is not defined" if empty? + + unless 0 <= num && num < row_count + raise ArgumentError, "invalid num (#{num.inspect} for 0..#{row_count - 1})" + end + + send(row ? :row : :column, num).map.with_index { |e, k| + e * cofactor(*(row ? [num, k] : [k,num])) + }.inject(:+) + end + alias_method :cofactor_expansion, :laplace_expansion + + #-- # TESTING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #++ -- cgit v1.2.3