gijyutsu-keisan.com

3.行列基本操作

行列基本操作に関する使い方を説明します。
行列基本操作
FuncAryExtRow(mat1, rowExt, Optional NumFlag) 二次配列から指定行を抽出
FuncAryExtCol(mat1, colExt, Optional NumFlag) 二次配列から指定列を抽出
FuncMatTrans(mat1) 行列の転置
ExchgAryRow(matA, IdEx1, IdEx2) 配列の指定行交換(Subプロシージャ)
ExchgAryCol(matA, IdEx1, IdEx2) 配列の指定列交換(Subプロシージャ)
FuncChkSym(matA, Optional rlim) 対称行列チェック

二次配列から指定行/列を抽出

  • FuncAryExtRow(mat1, rowExt, Optional NumFlag)
  • FuncAryExtCol(mat1, colExt, Optional NumFlag)
戻り値 抽出行/列配列(二次配列)。
mat1 対象とする二次配列。
rowExt
colExt
抽出行(rowExt)/列(colExt)番号。開始番号は0~。
1行のみ抽出:数値指定(rowExt=0)
連続複数行:"-"指定(rowExt=3-5)
ばらばら複数行:","区切り指定(rowExt=2,5)
ばらばら+連続:","と"-"の組み合わせ(rowExt=0,3-5,8,10-12)
NumFlag 未指定OK(false)。
true = 戻り値をDouble型にする。
false = 戻り値をVariant型にする。
VBAサンプルは次の通りです(列抽出を例にとります)。
mat1にセルB3~I10に下図のように数値を入力します。
Sub test()

Dim matA As Variant
Dim tmp As Variant

’セル値を配列に代入
matA = Range("B3:I10").Value

’配列matAからC2セルで指定した列を抽出
tmp = FuncAryExtCol(matA, Cells(2, 3).Value)

’抽出した二次配列をセルK3以降に出力
Range(Cells(3, 11), Cells(10, 11 + UBound(tmp, 2))).Value = tmp

End Sub
VBA実行後の結果は次のとおりです(図は1列目と4~6列目を抽出)。
Excel関数としても使えます(図は1列目と4~6列目を抽出)。

行列の転置

FuncMatTrans(mat1)
戻り値 転置後の二次配列。
mat1 転置させる二次配列。
VBAサンプルは次の通りです(列抽出を例にとります)。
mat1にセルB3~D10に下図のように数値を入力します。
Sub test()

Dim matA As Variant
Dim tmp As Variant

’セル値を配列に代入
matA = Range("B3:D10").Value

’配列matAからC2セルで指定した列を抽出
tmp = FuncMatTrans(matA)

’抽出した二次配列をセルK3以降に出力
Range(Cells(3, 6), Cells(3 + UBound(tmp, 1), 6 + UBound(tmp, 2))).Value = tmp

End Sub
VBA実行後の結果は次のとおりです。
FuncMatTransは、Excel関数としても使えます。

配列の指定行/列交換

  • ExchgAryRow(matA, IdEx1, IdEx2)
  • ExchgAryCol(matA, IdEx1, IdEx2)
これらはsubプロシージャです。
matA 交換する対象となる配列。
プロシージャ実行後、行/列交換後の配列に入れ替わり。
IdEx1
IdEx2
交換する行/列番号。
VBAサンプルは次の通りです(列交換を例にとります)。
mat1にセルB3~D10に下図のように数値を入力します。
Sub test()

Dim cnt1 As Long, cnt2 As Long
Dim tmp As Variant
Dim matA() As Double

’セル値を配列に代入
tmp = Range("B3:I10").Value

’配列開始番号を0~にするため、配列を置き換える
ReDim matA(UBound(tmp, 1) - 1, UBound(tmp, 2) - 1)
For cnt1 = LBound(tmp, 1) To UBound(tmp, 1)
For cnt2 = LBound(tmp, 2) To UBound(tmp, 2)
matA(cnt1 - 1, cnt2 - 1) = tmp(cnt1, cnt2)
Next cnt2
Next cnt1

’配列matAからC2セルで指定した列を抽出
Call ExchgAryCol(matA, Cells(2, 3).Value, Cells(2, 4).Value)

’抽出した二次配列をセルK3以降に出力
Range(Cells(3, 11), Cells(10, 11 + UBound(matA, 2))).Value = matA

End Sub
VBA実行後の結果は次のとおりです。

対称行列チェック

FuncChkSym(matA, Optional rlim)
戻り値 true:対称の場合。
false:非対称の場合。
matA チェックする行列。

VBAサンプルは次の通りです(列交換を例にとります)。
mat1にセルB3~D5に下図のように数値を入力します。
Sub test()

Dim cnt1 As Long, cnt2 As Long
Dim tmp As Variant
Dim matA() As Double

’セル値を配列に代入
tmp = Range("B3:D5").Value

’配列開始番号を0~にするため、配列を置き換える
ReDim matA(UBound(tmp, 1) - 1, UBound(tmp, 2) - 1)
For cnt1 = LBound(tmp, 1) To UBound(tmp, 1)
For cnt2 = LBound(tmp, 2) To UBound(tmp, 2)
matA(cnt1 - 1, cnt2 - 1) = tmp(cnt1, cnt2)
Next cnt2
Next cnt1
Erase tmp

’対称チェック
tmp = FuncChkSym(matA)

’結果出力
MsgBox tmp

End Sub
VBA実行後の結果は次のとおりです。

参考文献