=begin
[(())]
(())
/
(())
/
(())
/
(())
/
(())
= Algebra::MatrixAlgebra
((*(行列クラス)*))
行列を表現します。実際のクラスを生成するには基底環とサイズを指定して、
クラスメソッド ((<::create>)) あるいは関数 (())()
を用います。
サブクラスとして (())(縦ベクトル),
(())(横ベクトル),
(())(正方行列) を持ちます。
== ファイル名:
* ((|matrix-algebra.rb|))
== スーパークラス:
* ((|Object|))
== インクルードしているモジュール:
* (())
* Enumerable
== 関連する関数:
--- Algebra.MatrixAlgebra(ring, m, n)
((<::create>))(ring, m, n)と同じです。
== クラスメソッド:
--- ::create(ring, m, n)
環 ((|ring|)) を要素とする, (({ (m, n) })) 型の行列を
表現するクラスを生成します。
このメソッドの戻り値は (()) クラスのサブクラス
です。このサブクラスにはクラスメソッドとして ((|ground|)) と
((|rsize|)), ((|csize|)), ((|sizes|)) が定義され、それぞれ、
基底となる環 ((|ring|))、行のサイズ ((|m|))、列のサイズ ((|n|))、
それらの配列 (({ [m, n] })) を返します。
実際に行列を作るには ((<::new>)), ((<::matrix>)),
((<::[]>)) を使います。
--- ::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| ... }
((<::matrix>)) によく似ていますが、
返り値は Algebra::MatrixAlgebra でなく、2重配列(Array の Array)です。
--- ::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
(()) と同じサイズの縦ベクトル(Vector)クラスを返します。
--- ::covector_type
(()) と同じサイズの横ベクトル(CoVector)クラスを返します。
--- ::transpose
転置を行った新しい行列クラスを返します。
--- ::zero
零行列を返します。
#--- ::matrices; Matrices; end
#--- ::regulate(x)
== メソッド:
#--- dup
--- [](i, j)
(({(i, j)})) 成分を返します。
--- []=(i, j, x)
(({(i, j)})) 成分を x にします。
--- rsize
行サイズを返します。((<::rsize>)) と同じです。
--- csize
列サイズを返します。((<::csize>)) と同じです。
--- sizes
[(()), (())] の配列を返します。
((<::sizes>)) と同じです。
--- rows
各行を要素とする配列を返します。
例:
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)
i 行目を配列として返します。
--- set_row(i, array)
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)
j 列目を配列として返します。
--- set_column(j, array)
j 列目を配列 array に入れ換えます。
--- each{|row| ...}
各行を配列にして ((|row|)) に入れるイテレータです。
--- each_index{|i, j| ...}
各添え字 (({ (i, j) })) に関するイテレータです。
--- each_i{|i| ...}
各行の添え字 (({i})) に関するイテレータです。
--- each_j{|j| ...}
各列の添え字 (({j})) に関するイテレータです。
--- each_row{|r| ... }
各行を配列にして ((|r|)) に入れるイテレータです。
(()) と同じです。
--- each_column{|c| ... }
各列を配列にして ((|c|)) に入れるイテレータです。
--- matrix{|i, j| ... }
((<::matrix>)) と同じです。
--- collect_ij{|i, j| ... }
((<::collect_ij>)) と同じです。
--- collect_row{|i| ... }
((<::collect_row>)) と同じです。
--- collect_column{|j| ... }
((<::collect_column>)) と同じです。
--- minor(i, j)
((|i|)) 行 ((|j|)) 列を除いた小行列を返します。
--- cofactor(i, j)
((|i|)) 行 ((|j|)) 列を除いた小行列式に (-1)**(i+j) を掛けたものを
返します。(({minor(i, j) ** (i + j)})) と同じです。
--- cofactor_matrix
余因子行列を返します。(({self.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)
((|n|)) 乗を計算します。
--- /(other)
商を計算します。
--- rank
階数を返します。
--- dsum(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, -6
--- convert_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, 0
--- to_ary
((|to_a|)) を返します。((|to_a|)) は ((|Enumerable|)) で定義されています。
--- flatten
((|to_a.flatten|)) を返します。
--- diag
対角成分を配列で返します。
--- transpose
転置行列を返します。
例:
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]
#--- to_s
--- 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])
行列を ((|out|)) に表示します。((|out|)) が省略されると ((|$stdout|))
に表示します。
#--- inspect
= Algebra::Vector
((*(縦ベクトルクラス)*))
ベクトルのクラスです。
== スーパークラス:
* ((|Algebra::MatrixAlgebra|))
== インクルードしているモジュール:
なし
== 関連する関数:
--- Algebra.Vector(ring, n)
(())(ring, n) と同じです。
== クラスメソッド:
--- Algebra::Vector::create(ring, n)
環 ((|ring|)) を要素とする, ((|n|)) 次元のベクトル(縦ベクトル)
表現するクラスを生成します。
このメソッドの戻り値は (()) クラスのサブクラス
です。このサブクラスにはクラスメソッドとして ((|ground|)) と
((|size|)) が定義され、それぞれ、基底となる環 ((|ring|))、
サイズ ((|n|)) を返します。
実際にベクトルを作るにはクラスメソッド ((|new|)),
((|matrix|)),
((|[]|)) を使います。
(()) は ((|n|)) 行 1 列の
(()) と同一視されます。
--- 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| ... }
第 ((|i|)) 成分を ... にしたベクトルを返します。
((|j|)) には常に 0 が代入されます。
== メソッド:
--- size
次元を返します。
--- to_a
各成分を配列にして返します。
--- transpose
横ベクトル (()) に転置します。
--- inner_product(other)
((|other|)) との内積を返します。
--- inner_product_complex(other)
((|other|)) との内積を返します。
(({inner_product(other.conjugate)}))と同じです。
--- norm2
ノルムを返します。
(({inner_product(self)}))と同じです。
--- norm2_complex
ノルムを返します。
(({inner_product(self.conjugate)}))と同じです。
= Algebra::Covector
((*(横ベクトルクラス)*))
ベクトルのクラスです。
== スーパークラス:
* ((|Algebra::MatrixAlgebra|))
== インクルードしているモジュール:
なし
== 関連する関数:
--- Algebra.Covector(ring, n)
(()) (ring n)と同じです。
== クラスメソッド:
--- Algebra::Covector::create(ring, n)
環 ((|ring|)) を要素とする, ((|n|)) 次元のベクトル(横ベクトル)
表現するクラスを生成します。
このメソッドの戻り値は (()) クラスのサブクラス
です。このサブクラスにはクラスメソッドとして ((|ground|)) と
((|size|)) が定義され、それぞれ、基底となる環 ((|ring|))、
サイズ ((|n|)) を返します。
実際にベクトルを作るにはクラスメソッド ((|new|)),
((|matrix|)),
((|[]|)) を使います。
(()) は 1 行 ((|n|)) 列の (()) と
同一視されます。
--- 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| ... }
第 j 成分を ... にしたベクトルを返します。i には常に 0 が代入されます。
== メソッド:
--- size
次元を返します。
--- to_a
各成分を配列にして返します。
--- transpose
横ベクトル (()) に転置します。
--- inner_product(other)
((|other|)) との内積を返します。
--- inner_product_complex(other)
((|other|)) との内積を返します。
(({inner_product(other.conjugate)}))と同じです。
--- norm2
ノルムを返します。
(({inner_product(self)}))と同じです。
--- norm2_complex
ノルムを返します。
(({inner_product(self.conjugate)}))と同じです。
= Algebra::SquareMatrix
((*(正方行列環クラス)*))
正方行列の作る環を表現するクラスです。
== スーパークラス:
* ((|Algebra::MatrixAlgebra|))
== インクルードしているモジュール:
なし
== 関連する関数:
--- Algebra.SquareMatrix(ring, size)
(())(ring, n) と同じです。
== クラスメソッド:
--- Algebra::SquareMatrix::create(ring, n)
正方行列表現するクラスを生成します。
このメソッドの戻り値は
(()) クラスのサブクラス
です。このサブクラスにはクラスメソッドとして
((|ground|)) と
((|size|)) が定義され、それぞれ、基底となる環 ((|ring|))、
サイズ ((|n|)) を返します。
SquareMatrix は ((|n|)) 行 ((|n|)) 列の Algebra::MatrixAlgebra と同一視されます。
実際に行列を作るにはクラスメソッド ((|new|)),
((|matrix|)),
((|[]|)) を使います。
--- Algebra::SquareMatrix.determinant(aa)
配列の配列 ((|aa|)) の行列式を返します。
--- Algebra::SquareMatrix.det(aa)
(())と同じです。
--- Algebra::SquareMatrix::unity
単位行列を返します。
--- Algebra::SquareMatrix::zero
零行列を返します。
--- Algebra::SquareMatrix.const(x)
成分が ((|x|)) のスカラー行列を返します。
#--- self.regulate(x)
== メソッド
--- size
サイズを返します。
--- const(x)
成分が ((|x|)) のスカラー行列を返します。
#--- self.matrices
--- determinant
行列式を返します。
--- inverse
逆行列を返します。
--- /(other)
(({self * other.inverse})) を返します。((|other|)) がスカラーなら
各要素を ((|other|)) で割ります。
#--- sign(a)
#--- perm
--- char_polynomial(ring)
((|ring|)) に多項式環を与えると、特性多項式を返します。
--- char_matrix(ring)
((|ring|)) に多項式環を与えると、特性行列を返します。
--- _char_matrix(poly_ring_matrix)
((|poly_ring_matrix|)) に多項式成分の行列環を与えると、特性行列を返します。
= Algebra::GaussianElimination
((*(ガウスの消去法モジュール)*))
ガウスの掃き出し法を実現するモジュールです。
== ファイル名:
((|gaussian-elimination.rb|))
== インクルードしているモジュール:
なし
== クラスメソッド:
なし
== メソッド
--- swap_r!(i, j)
((|i|)) 行と ((|j|)) 行を入れ換えます。
--- swap_r(i, j)
((|i|)) 行と ((|j|)) 行を入れ換えたものを返します。
--- swap_c!(i, j)
((|i|)) 列と ((|j|)) 列を入れ換えます。
--- swap_c(i, j)
((|i|)) 列と ((|j|)) 列を入れ換えたものを返します。
--- multiply_r!(i, c)
((|i|)) 行目を ((|c|)) 倍します。
--- multiply_r(i, c)
((|i|)) 行目を ((|c|)) 倍したものを返します。
--- multiply_c!(j, c)
((|j|)) 列目を ((|c|)) 倍します。
--- multiply_c(j, c)
((|j|)) 列目を ((|c|)) 倍したものを返します。
--- divide_r!(i, c)
((|i|)) 行目を ((|c|)) で割ります。
--- divide_r(i, c)
((|i|)) 行目を ((|c|)) 割ったものを返します。
--- divide_c!(j, c)
((|j|)) 列目を ((|c|)) で割ります。
--- divide_c(j, c)
((|j|)) 列目を ((|c|)) 割ったものを返します。
--- mix_r!(i, j, c)
((|i|)) 行目に ((|j|)) 行目の ((|c|)) 倍を足します。
--- mix_r(i, j, c)
((|i|)) 行目に ((|j|)) 行目の ((|c|)) 倍を足したものを返します。
--- mix_c!(i, j, c)
((|i|)) 列目に ((|j|)) 列目の ((|c|)) 倍を足します。
--- mix_c(i, j, 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 #=> 2
--- left_inverse
左からの基本変形による一般逆行列です。
--- left_sweep
左からの基本変形で階段行列にして返します。
--- step_matrix?
階段行列であるとき、軸(pivot)の配列を返します。そうでないとき、nil
を返します。
--- kernel_basis
右から掛けて零になるベクトルの空間の基底の配列を返します。
各基底は (()) の要素です。
例:
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]
end
--- determinant_by_elimination
体上の正方行列の行列式を掃き出し法で求めます。
=end