Method: Abst::Matrix#solve
- Defined in:
- lib/include/matrix.rb
#solve ⇒ Object
- Param
-
self must be n * (n + 1) matrix s.t. (MB) M is invertible n * n matrix B is a column vector
- Return
-
a column vector X s.t. MX == B
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/include/matrix.rb', line 53 def solve raise MatrixSizeError unless @height + 1 == @width inverse = [] m = self.to_a n = @height n.times do |j| # Find non-zero entry row = nil j.upto(n - 1) do |i| unless m[i][j].zero? row = i break end end return nil unless row # Swap? if j < row m[row], m[j] = m[j], m[row] end # Eliminate inverse[j] = m[j][j].inverse (j + 1).upto(n - 1) do |i| c = m[i][j] * inverse[j] (j + 1).upto(n) do |j2| m[i][j2] -= m[j][j2] * c end end end # Solve triangular system x = [] (n - 1).downto(0) do |i| temp = m[i][n] (i + 1).upto(n - 1) do |j| temp -= m[i][j] * x[j] end x[i] = temp * inverse[i] end return Abst::Vector(self.class.coef_class, x) end |