MatrixAlgebra / MatrixAlgebra::Vector / MatrixAlgebra::Covector / GaussianElimination

MatrixAlgebra

(行列クラス)

行列を表現します。実際のクラスを生成するには基底環とサイズを指定して、 クラスメソッド MatrixAlgebra.create あるいは関数 MatrixAlgebra を用います。

サブクラスとして MatrixAlgebra::Vector(縦ベクトル), MatrixAlgebra::Covector(横ベクトル), MatrixAlgebra::SquareMatrix(正方行列) を持ちます。

ファイル名:

スーパークラス:

インクルードしているモジュール:

関連する関数:

MatrixAlgebra(ground, m, n)

MatrixAlgebra.create(ground, m, n)と同じです。

クラスメソッド:

MatrixAlgebra.create(ground, m, n)

ground を要素とする, (m, n) 型の行列を 表現するクラスを生成します。

このメソッドの戻り値は MatrixAlgebra クラスのサブクラス です。このサブクラスにはクラスメソッドとして groundrsize, csize, sizes が定義され、それぞれ、 基底となる環 ring、行のサイズ m, 列のサイズ n, それらの配列 [m, n] を返します。

実際に行列を作るには MatrixAlgebra.new, MatrixAlgebra.matrix, MatrixAlgebra.[] を使います。

MatrixAlgebra.new(array)

array を配列の配列とするとき、それを要素とする行列を返します。

例:

M = MatrixAlgebra(Integer, 2, 3)
a = M.new([[1, 2, 3], [4, 5, 6]])
a.display
  #=> [1, 2, 3]
  #=> [4, 5, 6]
MatrixAlgebra.matrix{|i, j| ... }

ij に行と列のインデックスを与え ... を評価した値を (i, j) 成分にした行列を返します。

例:

M = MatrixAlgebra(Integer, 2, 3)
a = M.matrix{|i, j| 10*(i + 1) + j + 1}
a.display
  #=> [11, 12, 13]
  #=> [21, 22, 23]
MatrixAlgebra.[array1, array2, ..., arrayr]

配列 array1, array2, ..., arrayr をそれぞれ行とする配列を返します。

例:

M = MatrixAlgebra(Integer, 2, 3)
a = M[[1, 2, 3], [4, 5, 6]]
a.display
  #=> [1, 2, 3]
  #=> [4, 5, 6]
MatrixAlgebra.collect_ij{|i, j| ... }

MatrixAlgebra.matrix によく似ていますが、 返り値は MatrixAlgebra でなく、2重配列(Array の Array)です。

MatrixAlgebra.collect_row{|i| ... }

第 i 行に ... を評価して得た配列を並べた行列を返します。

例:

M = 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]
MatrixAlgebra.collect_column{|j| ... }

第 j 列に ... を評価して得た配列を並べた行列を返します。

例:

M = MatrixAlgebra(Integer, 2, 3)
A = M.collect_column{|j| [11 + j, 21 + j]}
A.display
  #=> [11, 12, 13]
  #=> [21, 22, 23]
MatrixAlgebra.*(otype)

2つの行列の型を掛けた新しいクラスを返します。

例:

M = MatrixAlgebra(Integer, 2, 3)
N = MatrixAlgebra(Integer, 3, 4)
L = M * N
p L.sizes #=> [3, 4]
MatrixAlgebra.vector

rsize と同じサイズの縦ベクトル(Vector)クラスを返します。

MatrixAlgebra.covector

csize と同じサイズの横ベクトル(CoVector)クラスを返します。

MatrixAlgebra.transpose

転置を行った新しい行列クラスを返します。

MatrixAlgebra.zero

零行列を返します。

メソッド:

[i, j]

(i, j) 成分を返します。

[i, j] = x

(i, j) 成分を x にします。

rsize

行サイズを返します。MatrixAlgebra.rsize と同じです。

csize

列サイズを返します。MatrixAlgebra.csize と同じです。

sizes

[rsize, csize] の配列を返します。 MatrixAlgebra.sizes と同じです。

rows

各行を要素とする配列を返します。

例:

M = 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 = 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 と同じです。

each_column{|c| ... }

各列を配列にして c に入れるイテレータです。

matrix{|i, j| ... }

MatrixAlgebra.matrix と同じです。

collect_ij{|i, j| ... }

MatrixAlgebra.collect_ij と同じです。

collect_row{|i| ... }

MatrixAlgebra.collect_row と同じです。

collect_column{|j| ... }

MatrixAlgebra.collect_column と同じです。

==(other)

等しいとき真を返します。

+(other)

和を計算します。

-(other)

差を計算します。

*(other)

積を計算します。

例:

M = MatrixAlgebra(Integer, 2, 3)
N = 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)

商を計算します。

transpose

転置行列を返します。

例:

M = 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 = 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 に表示します。

MatrixAlgebra::Vector

(縦ベクトルクラス)

ベクトルのクラスです。

スーパークラス:

インクルードしているモジュール:

なし

関連する関数:

Vector(ground, n)

MatrixAlgebra::Vector.create(ground, n)と同じです。

クラスメソッド:

MatrixAlgebra::Vector.create(ground, n)

ground を要素とする, n 次元のベクトル(縦ベクトル) 表現するクラスを生成します。

このメソッドの戻り値は Vector クラスのサブクラス です。このサブクラスにはクラスメソッドとして groundsize が定義され、それぞれ、基底となる環 ring、 サイズ n を返します。

実際にベクトルを作るには MatrixAlgebra::Vector.new, MatrixAlgebra::Vector.matrix, MatrixAlgebra::Vector.[] を使います。

MatrixAlgebra::Vectorn 行 1 列の MatrixAlgebra と同一視されます。

MatrixAlgebra::Vector.new(array)

array を配列とするとき、それを要素とす る縦ベクトルを返します。

例:

V = Vector(Integer, 3)
a = V.new([1, 2, 3])
a.display
  #=> [1]
  #=> [2]
  #=> [3]
MatrixAlgebra::Vector.vector{|i| ... }

i 成分を ... にしたベクトルを返します。

例:

V = Vector(Integer, 3)
a = V.vector{|j| j + 1}
a.display
  #=> [1]
  #=> [2]
  #=> [3]
MatrixAlgebra::Vector.matrix{|i, j| ... }

i 成分を ... にしたベクトルを返します。 j には常に 0 が代入されます。

メソッド:

size

次元を返します。

to_a

各成分を配列にして返します。

transpose

横ベクトル MatrixAlgebra::Covector に転置します。

MatrixAlgebra::Covector

(横ベクトルクラス)

ベクトルのクラスです。

スーパークラス:

インクルードしているモジュール:

なし

関連する関数:

Covector(ground, n)

MatrixAlgebra::Covector.create(ground, n)と同じです。

クラスメソッド:

MatrixAlgebra::Covector.create(ground, n)

ground を要素とする, n 次元のベクトル(横ベクトル) 表現するクラスを生成します。

このメソッドの戻り値は Covector クラスのサブクラス です。このサブクラスにはクラスメソッドとして groundsize が定義され、それぞれ、基底となる環 ring、 サイズ n を返します。

実際にベクトルを作るには MatrixAlgebra::Covector.new, MatrixAlgebra::Covector.matrix, MatrixAlgebra::Covector.[] を使います。

MatrixAlgebra::Covector は 1 行 n 列の MatrixAlgebra と 同一視されます。

MatrixAlgebra::Covector.new(array)

array を配列とするとき、それを要素とす る横ベクトルを返します。

例:

V = Covector(Integer, 3)
a = V.new([1, 2, 3])
a.display
  #=> [1, 2, 3]
MatrixAlgebra::Covector.covector{|j| ... }

第 j 成分を ... にしたベクトルを返します。

例:

V = Covector(Integer, 3)
a = V.covector{|j| j + 1}
a.display
  #=> [1, 2, 3]
MatrixAlgebra::Covector.matrix{|i, j| ... }

第 j 成分を ... にしたベクトルを返します。i には常に 0 が代入されます。

メソッド:

size

次元を返します。

to_a

各成分を配列にして返します。

transpose

横ベクトル MatrixAlgebra::Vector に転置します。

MatrixAlgebra::SquareMatrix

(正方行列環クラス)

正方行列の作る環を表現するクラスです。

スーパークラス:

インクルードしているモジュール:

なし

関連する関数:

SquareMatrix(ground, size)

MatrixAlgebra::SquareMatrix.create(ground, n) と同じです。

クラスメソッド:

MatrixAlgebra::SquareMatrix.create(ground, n)

正方行列表現するクラスを生成します。

このメソッドの戻り値は SquareMatrix クラスのサブクラス です。このサブクラスにはクラスメソッドとして groundsize が定義され、それぞれ、基底となる環 ring、 サイズ n を返します。

SquareMatrix は nn 列の MatrixAlgebra と同一視されます。

実際に行列を作るには MatrixAlgebra.new, MatrixAlgebra.matrix, MatrixAlgebra.[] を使います。

MatrixAlgebra::SquareMatrix.unity

単位行列を返します。

MatrixAlgebra::SquareMatrix.zero

零行列を返します。

MatrixAlgebra::SquareMatrix.const(x)

成分が x のスカラー行列を返します。

メソッド

size

サイズを返します。

const(x)

成分が x のスカラー行列を返します。

determinant

行列式を返します。

char_polynomial(ring)

ring に多項式環を与えると、特性多項式を返します。

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 倍したものを返します。

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 = MatrixAlgebra(Rational, 4, 3)
a = M.matrix{|i, j| i*10 + j}
b = a.dup
c, d = 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
left_inverse

左からの基本変形による一般逆行列です。

left_sweep

左からの基本変形で階段行列にして返します。

step_matrix?

階段行列であるとき、軸(pivot)を返します。そうでないとき、nil を返します。

kernel_basis

右から掛けて零になるベクトルの空間の基底の配列を返します。 各基底は MatrixAlgebra::Vector の要素です。

例:

require "matrix-algebra"
require "mathn"
M = 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

体上の正方行列の行列式を掃き出し法で求めます。