[index-ja] Algebra::MatrixAlgebra / Algebra::Vector / Algebra::Covector / Algebra::SquareMatrix / Algebra::GaussianElimination
(行列クラス)
行列を表現します。実際のクラスを生成するには基底環とサイズを指定して、 クラスメソッド ::create あるいは関数 Algebra::MatrixAlgebra() を用います。
サブクラスとして Algebra::Vector(縦ベクトル), Algebra::Covector(横ベクトル), Algebra::SquareMatrix(正方行列) を持ちます。
Algebra.MatrixAlgebra(ring, m, n)::create(ring, m, n)環 ring を要素とする, (m, n) 型の行列を
表現するクラスを生成します。
このメソッドの戻り値は Algebra::MatrixAlgebra クラスのサブクラス
です。このサブクラスにはクラスメソッドとして ground と
rsize, csize, sizes が定義され、それぞれ、
基底となる環 ring、行のサイズ m、列のサイズ n、
それらの配列 [m, n] を返します。
::new(array)array を配列の配列とするとき、それを要素とする行列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3) a = M.new([[1, 2, 3], [4, 5, 6]]) a.display #=> [1, 2, 3] #=> [4, 5, 6]
::matrix{|i, j| ... }i と j に行と列のインデックスを与え ... を評価した値を
(i, j) 成分にした行列を返します。
例:
M = Alebra.MatrixAlgebra(Integer, 2, 3)
a = M.matrix{|i, j| 10*(i + 1) + j + 1}
a.display
#=> [11, 12, 13]
#=> [21, 22, 23]::[array1, array2, ..., arrayr]配列 array1, array2, ..., arrayr をそれぞれ行とする配列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3) a = M[[1, 2, 3], [4, 5, 6]] a.display #=> [1, 2, 3] #=> [4, 5, 6]
::collect_ij{|i, j| ... }::collect_row{|i| ... }第 i 行に ... を評価して得た配列を並べた行列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
A = M.collect_row{|i| [i*10 + 11, i*10 + 12, i*10 + 13]}
A.display
#=> [11, 12, 13]
#=> [21, 22, 23]::collect_column{|j| ... }第 j 列に ... を評価して得た配列を並べた行列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
A = M.collect_column{|j| [11 + j, 21 + j]}
A.display
#=> [11, 12, 13]
#=> [21, 22, 23]::*(otype)2つの行列の型を掛けた新しいクラスを返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3) N = Algebra.MatrixAlgebra(Integer, 3, 4) L = M * N p L.sizes #=> [3, 4]
::vector_type::covector_type::transpose::zero[i, j](i, j) 成分を返します。[i, j] = x(i, j) 成分を x にします。rsizecsizesizesrows各行を要素とする配列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
a = M.new([[1, 2, 3], [4, 5, 6]])
p a.rows #=> [[1, 2, 3], [4, 5, 6]]
p a.row(1) #=> [4, 5, 6]
a.set_row(1, [40, 50, 60])
a.display #=> [1, 2, 3]
#=> [40, 50, 60]row(i)set_row(i, array)columns各列を要素とする配列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
a = M.new([[1, 2, 3], [4, 5, 6]])
p a.columns #=> [[1, 4], [2, 5], [3, 6]]
p a.column(1) #=> [2, 5]
a.set_column(1, [20, 50])
a.display #=> [1, 20, 3]
#=> [4, 50, 6]column(j)set_column(j, array)each{|row| ...}each_index{|i, j| ...} (i, j) に関するイテレータです。each_i{|i| ...}i に関するイテレータです。each_j{|j| ...}j に関するイテレータです。each_row{|r| ... }each_column{|c| ... }matrix{|i, j| ... }collect_ij{|i, j| ... }collect_row{|i| ... }collect_column{|j| ... }minor(i, j)cofactor(i, j)minor(i, j) ** (i + j) と同じです。cofactor_matrixself.class.transpose.matrix{|i, j| cofactor(j, i)} と同じです。adjoint==(other)+(other)-(other)*(other)積を計算します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
N = Algebra.MatrixAlgebra(Integer, 3, 4)
L = M * N
a = M[[1, 2, 3], [4, 5, 6]]
b = N[[-3, -2, -1, 0], [1, 2, 3, 4], [5, 6, 7, 8]]
c = a * b
p c.type #=> L
c.display #=> [14, 20, 26, 32]
#=> [23, 38, 53, 68]**(n)/(other)rankdsum(other)直和を返します。
例:
a = Algebra.MatrixAlgebra(Integer, 2, 3)[
[1, 2, 3],
[4, 5, 6]
]
b = Algebra.MatrixAlgebra(Integer, 3, 2)[
[-1, -2],
[-3, -4],
[-5, -6]
]
(a.dsum b).display #=> 1, 2, 3, 0, 0
#=> 4, 5, 6, 0, 0
#=> 0, 0, 0, -1, -2
#=> 0, 0, 0, -3, -4
#=> 0, 0, 0, -5, -6convert_to(ring)self の各成分を行列環 ring にコンバートします。
Example:
require "matrix-algebra"
require "residue-class-ring"
Z3 = Algebra.ResidueClassRing(Integer, 3)
a = Algebra.MatrixAlgebra(Integer, 2, 3)[
[1, 2, 3],
[4, 5, 6]
]
a.convert_to(Algebra.MatrixAlgebra(Z3, 2, 3)).display
#=> 1, 2, 0
#=> 1, 2, 0to_aryflattendiagtranspose転置行列を返します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
a = M.new([[1, 2, 3], [4, 5, 6]])
Mt = M.transpose
b = a.transpose
p b.type #=> Mt
b.display #=> [1, 4]
#=> [2, 5]
#=> [3, 6]dup複製します。
例:
M = Algebra.MatrixAlgebra(Integer, 2, 3)
a = M.new([[1, 2, 3], [4, 5, 6]])
b = a.dup
b[1, 1] = 50
a.display #=> [1, 2, 3]
#=> [4, 5, 6]
b.display #=> [1, 2, 3]
#=> [4, 50, 6]display([out])(縦ベクトルクラス)
ベクトルのクラスです。
なし
Algebra.Vector(ring, n)Algebra::Vector::create(ring, n)環 ring を要素とする, n 次元のベクトル(縦ベクトル) 表現するクラスを生成します。
このメソッドの戻り値は Algebra::Vector クラスのサブクラス です。このサブクラスにはクラスメソッドとして ground と size が定義され、それぞれ、基底となる環 ring、 サイズ n を返します。
実際にベクトルを作るにはクラスメソッド new, matrix, [] を使います。
Algebra::Vector は n 行 1 列の Algebra::MatrixAlgebra と同一視されます。
Algebra::Vector::new(array)array を配列とするとき、それを要素とす る縦ベクトルを返します。
例:
V = Algebra.Vector(Integer, 3) a = V.new([1, 2, 3]) a.display #=> [1] #=> [2] #=> [3]
Algebra::Vector::vector{|i| ... }第 i 成分を ... にしたベクトルを返します。
例:
V = Algebra.Vector(Integer, 3)
a = V.vector{|j| j + 1}
a.display
#=> [1]
#=> [2]
#=> [3]Algebra::Vector::matrix{|i, j| ... }sizeto_atransposeinner_product(other)inner_product_complex(other)inner_product(other.conjugate)と同じです。norm2inner_product(self)と同じです。norm2_complexinner_product(self.conjugate)と同じです。(横ベクトルクラス)
ベクトルのクラスです。
なし
Algebra.Covector(ring, n)Algebra::Covector::create(ring, n)環 ring を要素とする, n 次元のベクトル(横ベクトル) 表現するクラスを生成します。
このメソッドの戻り値は Algebra::Covector クラスのサブクラス です。このサブクラスにはクラスメソッドとして ground と size が定義され、それぞれ、基底となる環 ring、 サイズ n を返します。
実際にベクトルを作るにはクラスメソッド new, matrix, [] を使います。
Algebra::Covector は 1 行 n 列の Algebra::MatrixAlgebra と 同一視されます。
Algebra::Covector::new(array)array を配列とするとき、それを要素とす る横ベクトルを返します。
例:
V = Algebra.Covector(Integer, 3) a = V.new([1, 2, 3]) a.display #=> [1, 2, 3]
Algebra::Covector::covector{|j| ... }第 j 成分を ... にしたベクトルを返します。
例:
V = Algebra.Covector(Integer, 3)
a = V.covector{|j| j + 1}
a.display
#=> [1, 2, 3]Algebra::Covector::matrix{|i, j| ... }sizeto_atransposeinner_product(other)inner_product_complex(other)inner_product(other.conjugate)と同じです。norm2inner_product(self)と同じです。norm2_complexinner_product(self.conjugate)と同じです。(正方行列環クラス)
正方行列の作る環を表現するクラスです。
なし
Algebra.SquareMatrix(ring, size)Algebra::SquareMatrix::create(ring, n)正方行列表現するクラスを生成します。
このメソッドの戻り値は Algebra::SquareMatrix クラスのサブクラス です。このサブクラスにはクラスメソッドとして ground と size が定義され、それぞれ、基底となる環 ring、 サイズ n を返します。
SquareMatrix は n 行 n 列の Algebra::MatrixAlgebra と同一視されます。
実際に行列を作るにはクラスメソッド new, matrix, [] を使います。
Algebra::SquareMatrix.determinant(aa)Algebra::SquareMatrix.det(aa)Algebra::SquareMatrix::unityAlgebra::SquareMatrix::zeroAlgebra::SquareMatrix.const(x)sizeconst(x)determinantinverse/(other)self * other.inverse を返します。other がスカラーなら
各要素を other で割ります。char_polynomial(ring)char_matrix(ring)_char_matrix(poly_ring_matrix)(ガウスの消去法モジュール)
ガウスの掃き出し法を実現するモジュールです。
gaussian-elimination.rb
なし
なし
swap_r!(i, j)swap_r(i, j)swap_c!(i, j)swap_c(i, j)multiply_r!(i, c)multiply_r(i, c)multiply_c!(j, c)multiply_c(j, c)divide_r!(i, c)divide_r(i, c)divide_c!(j, c)divide_c(j, c)mix_r!(i, j, c)mix_r(i, j, c)mix_c!(i, j, c)mix_c(i, j, c)left_eliminate!左からの基本変形で階段行列に変形します。
戻り値は、変形するのに使った正方行列の積とその正方行列の 行列式と階数の配列です。
例:
require "matrix-algebra"
require "mathn"
class Rational < Numeric
def inspect; to_s; end
end
M = Algebra.MatrixAlgebra(Rational, 4, 3)
a = M.matrix{|i, j| i*10 + j}
b = a.dup
c, d, e = b.left_eliminate!
b.display #=> [1, 0, -1]
#=> [0, 1, 2]
#=> [0, 0, 0]
#=> [0, 0, 0]
c.display #=> [-11/10, 1/10, 0, 0]
#=> [1, 0, 0, 0]
#=> [1, -2, 1, 0]
#=> [2, -3, 0, 1]
p c*a == b#=> true
p d #=> 1/10
p e #=> 2left_inverseleft_sweepstep_matrix?kernel_basis右から掛けて零になるベクトルの空間の基底の配列を返します。 各基底は Algebra::Vector の要素です。
例:
require "matrix-algebra"
require "mathn"
M = Algebra.MatrixAlgebra(Rational, 5, 4)
a = M.matrix{|i, j| i + j}
a.display #=>
#[0, 1, 2, 3]
#[1, 2, 3, 4]
#[2, 3, 4, 5]
#[3, 4, 5, 6]
#[4, 5, 6, 7]
a.kernel_basis.each do |v|
puts "a * #{v} = #{a * v}"
#=> a * [1, -2, 1, 0] = [0, 0, 0, 0, 0]
#=> a * [2, -3, 0, 1] = [0, 0, 0, 0, 0]
enddeterminant_by_elimination