Method: Abst::Matrix#solve

Defined in:
lib/include/matrix.rb

#solveObject

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

Raises:



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