[解決済み] Givens回転を用いたQR分解アルゴリズム
2022-02-19 16:01:15
質問
MATLABでQR分解アルゴリズムをコーディングしているのですが、仕組みが正しいかどうか念のため確認します。 以下はメイン関数のコードです。
function [Q,R] = QRgivens(A)
n = length(A(:,1));
Q = eye(n);
R = A;
for j = 1:(n-1)
for i = n:(-1):(j+1)
G = eye(n);
[c,s] = GivensRotation( A(i-1,j),A(i,j) );
G(i-1,(i-1):i) = [c s];
G(i,(i-1):i) = [-s c];
Q = Q*G';
R = G*R;
end
end
end
サブ関数 GivensRotation を以下に示す。
function [c,s] = GivensRotation(a,b)
if b == 0
c = 1;
s = 0;
else
if abs(b) > abs(a)
r = -a / b;
s = 1 / sqrt(1 + r^2);
c = s*r;
else
r = -b / a;
c = 1 / sqrt(1 + r^2);
s = c*r;
end
end
end
調べたところ、特にMATLABでこの分解を実装する最も簡単な方法の1つであることは間違いないようです。 しかし、行列Aでテストしてみると、生成されるRは本来あるべき右三角形ではありません。 Qは直交しており、Q*R = Aなので、このアルゴリズムはいくつかのことを正しく行っていますが、正確に正しい分解を生成しているわけではありません。 おそらく、私はこの問題を長く見つめすぎているのだと思いますが、私が見落としていることについて何か洞察があれば、感謝します。
どのように解決するのですか?
は、バグが多いようです。 を見ることができます。
- むしろ [c,s] = GivensRotation( R(i-1,j),R(i,j) ); を使うべきでしょう(注意:AではなくRです)。
- 元の乗算 Q = Q*G'; R = G*R は正しいです。
- r = a/b と r = b/a (マイナスなし、重要かどうかは不明)
- G([i-1, i],[i-1, i]) = [c -s; s c];
以下はコードの例で、うまくいっているようです。
最初のファイルです。
% qrgivens.m
function [Q,R] = qrgivens(A)
[m,n] = size(A);
Q = eye(m);
R = A;
for j = 1:n
for i = m:-1:(j+1)
G = eye(m);
[c,s] = givensrotation( R(i-1,j),R(i,j) );
G([i-1, i],[i-1, i]) = [c -s; s c];
R = G'*R;
Q = Q*G;
end
end
end
と、2番目の
% givensrotation.m
function [c,s] = givensrotation(a,b)
if b == 0
c = 1;
s = 0;
else
if abs(b) > abs(a)
r = a / b;
s = 1 / sqrt(1 + r^2);
c = s*r;
else
r = b / a;
c = 1 / sqrt(1 + r^2);
s = c*r;
end
end
end
関連
-
[解決済み] MATLABで軸の制限をグローバルに設定し、プロットされたデータの最小値と最大値にする方法は?
-
[解決済み] MATLABエラー "このコンテキストでは関数定義は許可されていません。" [重複しています]。
-
[解決済み] エラー --> 整数には同じクラスの整数か、スカラー倍数しか組み合わせることができません。
-
[解決済み] Matlab: 逆コサイン(acos)の完全解を返す
-
[解決済み] プロットを回転させる?
-
[解決済み] Matlabでm-fileを実行するとき、コマンドビューでどのように改行を出力するのですか?
-
[解決済み] MATLABでマシンイプシロンを計算する方法は?
-
[解決済み] 匿名関数の微分
-
[解決済み] 行列の列数を求めるには?
-
[解決済み] MATLABでヒストグラムを正規化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"配列のインデックスは正の整数または論理値でなければならない"
-
[解決済み] matlabで関数ハンドルを使った操作
-
[解決済み] セルコンテンツから非セル配列オブジェクトへの代入
-
[解決済み] matlabでhashtables/hashmapsを使う方法はありますか?重複
-
[解決済み] 単純論理条件フラグ MATLAB
-
[解決済み] matlab、デフォルトの図サイズを設定するが、位置は気にしない?
-
[解決済み] データの補間は失敗:グリッドベクトルは与えられた値に一致する点のグリッドを定義しない
-
[解決済み] 指定された矩形に含まれる配列中の点を見つける( matlab )
-
[解決済み] MATLABのパスに影をつける」とはどういう意味ですか?ファイル内で行うにはどうしたらいいですか?
-
[解決済み] MATLABのコードヘルプです。バックワードオイラー法