9.スケーリング/ピボッティング
12.連立方程式の解法(反復法)
| 行列基本操作 | ||
|---|---|---|
| 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) | 対称行列チェック | |
| 戻り値 | 抽出行/列配列(二次配列)。 |
|---|---|
| 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型にする。 |
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
Excel関数としても使えます(図は1列目と4~6列目を抽出)。
| 戻り値 | 転置後の二次配列。 |
|---|---|
| mat1 | 転置させる二次配列。 |
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
FuncMatTransは、Excel関数としても使えます。
| matA |
交換する対象となる配列。 プロシージャ実行後、行/列交換後の配列に入れ替わり。 |
|
IdEx1 IdEx2 |
交換する行/列番号。 |
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
| 戻り値 |
true:対称の場合。 false:非対称の場合。 |
|---|---|
| matA | チェックする行列。 |
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