Excelで行列計算をする方法【コピペで行列計算できるVBAの関数あります】
VBAで行列計算をしたいとき、わざわざfor文を毎回回すのは面倒ですよね。
引数の説明は以下の通りです。
そこで、行列計算をする関数を用意しました。
今回はその行列計算の関数の紹介と説明をしたいと思います。
行列計算に必要な関数
まず、行列計算をする関数を作るのに使った関数を紹介しておきます。
行列計算をするには、引数として与えられた配列の要素数を計算に使います。
ここで引数として配列のサイズを入力してもらってもいいんですけど、関数で求められるならそっちの方が楽ですよね。
そしてその配列の要素数を得る関数はUBound関数です。
UBound(配列名)
のように使います。
この関数は多次元配列でも使うことができ、例として2次元配列の場合は
UBound(配列名,2)のように使います。
行列計算の関数
行列をExcelで計算するときに使うものとして、
・行列の書き出し
・行列の読み込み
・行列の掛け算
・行列の足し算
を用意しました。
どれも簡単に使えるので、ぜひ使ってみてください。
また引き算と割り算はそれぞれ足し算と掛け算の部分を少しいじればできると思うので、使う人はいじってみてください。
行列の書き出し
行列を配列からセルに書きだします。
Function mat_write(matrix(), row, column) Dim rsize, csize rsize = UBound(matrix) csize = UBound(matrix, 2) For i = 0 To rsize - 1 For j = 0 To csize - 1 Cells(i + row, j + column).Value = matrix(j, i) Next j Next i mat_write = matrix() End Function
matrix():書きだす行列
row:書きだすセルの左上の行番号(縦の数字)
column:書きだすセルの左上の列番号(横のアルファベットが何番目か。Cなら3)
行列の読み込み
行列をセルから配列に読み込みます。
Function mat_read(row, column, rsize, csize) Dim matrix() ReDim matrix(rsize, csize) For i = 0 To rsize - 1 For j = 0 To csize - 1 matrix(j, i) = Cells(row + i, column + j).Value Next j Next i mat_read = matrix() End Function
引数の説明
row:読み込むセルの左上の行番号
column:読み込むセルの左上の列番号
rsize:読み込む行列の行のサイズ
csize:読み込む行列の列のサイズ
行列の掛け算
行列の掛け算をします。
Function mat_mul(a(), b()) rsize = UBound(a) csize = UBound(b, 2) If rsize <> csize Then MsgBox ("行列のサイズがあっていないために掛け算ができません") mat_mul = Null End If Dim c() ReDim c(rsize, csize) For i = 0 To rsize - 1 For j = 0 To csize - 1 s = 0 For k = 0 To rsize s = s + a(i, k) * b(k, j) Next k c(i, j) = s Next Next mat_mul = c() End Function
一応、サイズが合っていない行列が与えられた場合にはエラーを吐き出すようにしておきました。
引数はかけたい2つの行列です。
かける順番に気を付けてください。
行列の足し算
行列の足し算です。
Function mat_add(a(), b()) If UBound(a) <> UBound(b) Or UBound(a, 2) <> UBound(b, 2) Then MsgBox ("行列のサイズが一致していないので足し算ができません") mat_add = Null End If Dim c() ReDim c(UBound(a), UBound(a, 2)) For i = 0 To UBound(a) - 1 For j = 0 To UBound(a, 2) - 1 c(i, j) = a(i, j) + b(i, j) Next Next mat_add = c() End Function
これもサイズがあっていない場合にはエラーを吐き出します。
引数は足したい2つの行列です。
まとめ
行列計算をエクセルのVBAでできるようにしてみました。
もっと効率の良い書き方があればぜひ教えてください。
コメント
0 件のコメント :
コメントを投稿