detA = ∑ A1j ˜ A1j

行列式の計算 for VBA
行列式の余因子展開式、
X
det A =
A1j Ã1j ,
j
Ãij は (行列 A の i 行と j 列を取り除いた行列の行列式) × (−1)i+j
を利用し、行列式を簡単に数値計算することができます。以下は VBA のソース
で、例えば Excel VBA の標準モジュールに貼り付ければ実際に機能します。
Type Matrix ’ 行列の型
Ele(10, 10) As Single
Dim As Variant
End Type
Function Determ(a As Matrix) ’ 行列式
If a.Dim = 1 Then
Determ = a.Ele(1, 1)
ElseIf a.Dim = 2 Then
Determ = a.Ele(1, 1) * a.Ele(2, 2) - a.Ele(1, 2) * a.Ele(2, 1)
Else
s = 0: For j = 1 To a.Dim
s = s + a.Ele(1, j) * CoFactor(a, 1, j)
Next j: Determ = s
End If
End Function
Function CoFactor(a As Matrix, i, j) ’ 余因子
Dim b As Matrix: b.Dim = a.Dim - 1
For x = 1 To b.Dim: For y = 1 To b.Dim
xd = x: If x >= i Then xd = x + 1
yd = y: If y >= j Then yd = y + 1
b.Ele(x, y) = a.Ele(xd, yd)
Next y: Next x
CoFactor = Determ(b) * (-1) ^ (i + j)
End Function
Function CoMatrix(a As Matrix) As Matrix ’ 余因子行列
Dim b As Matrix: b.Dim = a.Dim
For i = 1 To b.Dim: For j = 1 To b.Dim
b.Ele(i, j) = CoFactor(a, j, i)
Next j: Next i
CoMatrix = b
End Function
行列の型の定義において、Ele は成分、Dim は次数を表すプロパティとして定義
しています。最大で 10 次正方行列まで扱えるようになっています。行列式のプロ
1
シージャにおいて a.Dim = 2 の分岐は不要ですが、処理を軽くするために入れて
います。
行列式のプロシージャが余因子のそれを呼び、また逆に余因子のそれが行列式
のそれを呼び、再帰的に行列式が計算されることがわかるでしょう。実際に行列
式や余因子行列を計算させるためには、以下のプロシージャを加えます。
Sub IOMatrix(a As Matrix, y, x, s) ’ 行列入出力
For i = 1 To a.Dim: For j = 1 To a.Dim
If s = "in" Then a.Ele(i, j) = Cells(y - 1 + i, x - 1 + j).Value
If s = "out" Then Cells(y - 1 + i, x - 1 + j).Value = a.Ele(i, j)
Next j: Next i
End Sub
Sub Test() ’ テスト
Dim a As Matrix
a.Dim = Cells(1, 1).Value
Call IOMatrix(a, 3, 1, "in")
Call IOMatrix(CoMatrix(a), a.Dim + 4, 1, "out")
Cells(2 * a.Dim + 5, 1).Value = Determ(a)
End Sub
Excel で Test を実行すると図 1 のようになります。
図 1: 余因子行列と行列式の出力
Excel は行列式や逆行列の関数を独自に持っているので、この処理自体にはさほ
ど意味はありませんが、VBA で行列を含む複雑な数値計算をする時に、その基礎
になるであろうスクリプトです。
2