9.スケーリング/ピボッティング
12.連立方程式の解法(反復法)
QR分解 | ||
---|---|---|
FuncMatQRGS(mat1, Optional aryFlag) | QR分解:グラムシュミット法 | |
FuncMatQRHH(mat1, Optional pivFlag, Optional plim, Optional rlim, Optional aryFlag) | QR分解:ハウスホルダー法 |
戻り値 |
ジャグ配列または二次配列で結果を出力。 二次配列の場合、上からユニタリ行列Q、上三角行列R。 ジャグ配列の場合、(0)(行,列)=ユニタリ行列Q、(1)(行,列)=上三角行列R。 |
---|---|
mat1 | QR分解対象行列(二次配列)。 |
aryFlag |
前処理行列の出力方法。 0=ジャグ配列。 2=1つの配列にまとめて出力。 |
Sub test2() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’グラムシュミット法によるQR分解 tmp = FuncMatQRGS(matA, 0) ’結果出力(ジャグ配列) cntR1 = 3 cntC1 = 7 For cnt1 = 0 To UBound(tmp) cntR2 = cntR1 + UBound(tmp(cnt1), 1) cntC2 = cntC1 + UBound(tmp(cnt1), 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp(cnt1) cntR1 = cntR2 + 2 Next cnt1 End Sub
Sub test3() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’グラムシュミット法によるQR分解 tmp = FuncMatQRGS(matA, 2) ’結果出力(二次配列) cntR1 = 3 cntC1 = 7 cntR2 = cntR1 + UBound(tmp, 1) cntC2 = cntC1 + UBound(tmp, 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp End Sub
戻り値 |
ジャグ配列または二次配列で結果を出力。 二次配列の場合、上からユニタリ行列Q、上三角行列R、列前処理行列Pc。 ジャグ配列の場合、(0)(行,列)=ユニタリ行列Q、(1)(行,列)=上三角行列R、(2)(行,列)=列前処理行列Pc。 |
---|---|
mat1 |
QR分解対象行列(二次配列)。 行数≧列数を満たせば、正方行列でなくても構いません。 |
pivFlag |
前処理フラグ(省略可)。 0=部分列ピボット、1=列スケーリング+ピボット |
plim | ピボット処理閾値(省略可)。デフォルト値=2e-12。 |
rlim | 数値丸め閾値(省略可)。デフォルト値=2e-12。 |
aryFlag |
前処理行列の出力方法。 0=ジャグ配列 + 変換行列連立方程式用(デフォルト)。 1=ジャグ配列 + 変換行列分解確認用。 2=1つの配列にまとめて出力 + 変換行列連立方程式用。 3=1つの配列にまとめて出力 + 変換行列分解確認用。 |
Sub test2() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’ハウスホルダー法によるQR分解 tmp = FuncMatQRHH(matA, , , , 1) ’結果出力(ジャグ配列) cntR1 = 3 cntC1 = 7 For cnt1 = 0 To UBound(tmp) cntR2 = cntR1 + UBound(tmp(cnt1), 1) cntC2 = cntC1 + UBound(tmp(cnt1), 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp(cnt1) cntR1 = cntR2 + 2 Next cnt1 End Sub
Sub test3() Dim cnt1 As Integer Dim cntC1 As Integer, cntC2 As Integer Dim cntR1 As Integer, cntR2 As Integer Dim tmp As Variant Dim matA As Variant ’行列の取得 cntR1 = 3 cntC1 = 2 cntR2 = Cells(cntR1, cntC1).End(xlDown).Row cntC2 = Cells(cntR1, cntC1).End(xlToRight).Column matA = Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value ’ハウスホルダー法によるQR分解 tmp = FuncMatQRHH(matA, , , , 3) ’結果出力(二次配列) cntR1 = 3 cntC1 = 7 cntR2 = cntR1 + UBound(tmp, 1) cntC2 = cntC1 + UBound(tmp, 2) Range(Cells(cntR1, cntC1), Cells(cntR2, cntC2)).Value = tmp End Sub