Main Content

qr

シンボリック行列の QR 分解

説明

R = qr(A) は、QR 分解 A = Q*RR 因子を返します。ここで、A は m 行 n 列のシンボリック行列、R は m 行 n 列の上三角シンボリック行列、Q は m 行 m 列のユニタリ シンボリック行列です。

[Q,R] = qr(A) は、A = Q*R となるように上三角行列 R とユニタリ行列 Q を返します。

[Q,R,P] = qr(A) は、A*P = Q*R となる置換行列 P も返します。A のすべての要素が浮動小数点数で近似できる場合、この構文は abs(diag(R)) が降順になるように置換行列 P を選択します。そうでない場合は P = eye(n) を返します。

[___] = qr(A,"econ") は、前述の出力引数の組み合わせのいずれかを使用してエコノミーサイズの分解を返します。出力のサイズは、m 行 n 列の行列 A のサイズに応じて、次のように異なります。

  • m > n の場合、qrQ の最初の n 列と R の最初の n 行のみを計算する。

  • m ≤ n の場合、エコノミーサイズの分解は、"econ" オプションを使用しない場合の QR 分解と同じになる。

既定では、"econ" を使用すると、qr は置換情報を行列 P として返します。

[Q,R,P] = qr(___,outputForm) は、置換情報 P を行列またはベクトルのどちらで返すかを指定します。たとえば、outputForm"vector" の場合、A(:,P) = Q*R になります。outputForm の既定値は、A*P = Q*R となる "matrix" です。

[___] = qr(A,0) は、qr(A,"econ","vector") と等価です。この構文は推奨されていません。代わりに "econ" オプションを使用してください。

[C,R] = qr(A,B) は、C = Q'*B および A = Q*R となるように上三角行列 R と行列 C を返します。ここでは、A および B は同じ行数でなければなりません。

CR は、行列方程式 A*X = B の解を X = R\C として表現します。

[C,R,P] = qr(A,B) は、A*P = Q*R となる置換行列 P も返します。A のすべての要素が浮動小数点数で近似できる場合、この構文は abs(diag(R)) が降順になるように置換行列 P を選択します。そうでない場合は P = eye(n) を返します。

CR、および P は、行列方程式 A*X = B の解を X = P*(R\C) として表します。

[___] = qr(A,B,"econ") は、前述の出力引数の組み合わせのいずれかを使用してエコノミーサイズの分解を返します。出力のサイズは、m 行 n 列の行列 A のサイズに応じて、次のように異なります。

  • m > n の場合、qrCR の最初の n 行のみを計算する。

  • m ≤ n の場合、エコノミーサイズの分解は、"econ" オプションを使用しない場合の QR 分解と同じになる。

既定では、"econ" を使用すると、qr は置換情報を行列 P として返します。

[C,R,P] = qr(___,outputForm) は、置換情報 P を行列またはベクトルのどちらで返すかを指定します。たとえば、outputForm"vector" の場合、行列方程式 A*X = B の解は X(P,:) = R\C になります。outputForm の既定値は "matrix" で、A*X = B の解が X = P*(R\C) となります。

[___] = qr(A,B,0) は、qr(A,B,"econ","vector") と等価です。この構文は推奨されていません。代わりに "econ" オプションを使用してください。

___ = qr(___,"real") は、入力引数と中間結果が実数であることを仮定するため、abs および conj への呼び出しを無効にします。このオプションを使用すると、qr はすべてのシンボリック変数が実数を表すと仮定します。この構文では、すべての数値引数が実数でなければなりません。

"real" を使用して、結果に複素共役が含まれないようにします。

すべて折りたたむ

44 列のウィルキンソンの固有値テスト行列の QR 分解の上三角 R 因子を計算します。

44 列のウィルキンソンの固有値テスト行列を作成します。

A = sym(wilkinson(4))
A = 

(32100112100112100132)

Q 因子を返さずに、QR 分解の R 因子を返します。

R = qr(A)
R = 

(13241313213130013532610135368921353530053381106172533812019300035381762)

3 行 3 列のパスカル行列の QR 分解を計算します。

3 行 3 列のパスカル行列を作成します。

A = sym(pascal(3))
A = 

(111123136)

A の QR 分解を表現する Q 行列と R 行列を計算します。

[Q,R] = qr(A)
Q = 

(33-2266330-63332266)

R = 

(3231033025220066)

isAlways を使用して、A = Q*R であることを検証します。

TF = isAlways(A == Q*R)
TF = 3x3 logical array

   1   1   1
   1   1   1
   1   1   1

置換を使用して、浮動小数点行列の QR 分解の数値安定性を向上させます。関数 qr は、置換情報を行列またはベクトルとして返します。

可変精度の演算を行うための有効小数桁数を 10 に設定します。3 行 3 列のシンボリック ヒルベルト行列を浮動小数点数で近似します。

previoussetting = digits(10);
A = vpa(hilb(3))
A = 

(1.00.50.33333333330.50.33333333330.250.33333333330.250.2)

まず、A の QR 分解を置換なしで計算します。

[Q,R] = qr(A)
Q = 

(0.8571428571-0.50160491660.11704114720.42857142860.5684855721-0.70224688320.28571428570.65208639150.7022468832)

R = 

(1.1666666670.64285714290.4500.10171433030.1053370325000.003901371573)

AQ*R の差を計算します。丸め誤差のため、計算された行列 QR は、厳密に等式 A = Q*R を満たしません。

E = A - Q*R
E = 

(-3.469446952e-18-6.938893904e-18-4.33680869e-180-1.734723476e-18-8.67361738e-190-8.67361738e-19-4.33680869e-19)

QR 分解の数値安定性を上げるには、3 つの出力引数を使用する構文を指定することで置換を使用します。シンボリック変数、式または関数を含まない行列に対し、次の構文ではピボットがトリガーされ、R に返される行列の abs(diag(R)) が降順になります。

[Q,R,P] = qr(A)
Q = 

(0.8571428571-0.4969293466-0.13552618540.42857142860.54210474170.72280632230.28571428570.6776309272-0.6776309272)

R = 

(1.1666666670.450.642857142900.10540925530.1016446391000.003764616262)

P = 3×3

     1     0     0
     0     0     1
     0     1     0

等式 A*P = Q*R を確認します。置換を使用した QR 分解では、丸め誤差が小さくなります。

E = A*P - Q*R
E = 

(-3.469446952e-18-4.33680869e-18-6.938893904e-180-8.67361738e-19-1.734723476e-180-4.33680869e-19-1.734723476e-18)

次に、"vector" 引数を使用して置換情報をベクトルとして返します。

[Q,R,p] = qr(A,"vector")
Q = 

(0.8571428571-0.4969293466-0.13552618540.42857142860.54210474170.72280632230.28571428570.6776309272-0.6776309272)

R = 

(1.1666666670.450.642857142900.10540925530.1016446391000.003764616262)

p = 1×3

     1     3     2

A(:,p) = Q*R であることを検証します。

E = A(:,p) - Q*R
E = 

(-3.469446952e-18-4.33680869e-18-6.938893904e-180-8.67361738e-19-1.734723476e-180-4.33680869e-19-1.734723476e-18)

厳密なシンボリック計算では、丸め誤差は発生しません。

A = sym(hilb(3));
[Q,R] = qr(A);
E = A - Q*R
E = 

(000000000)

10 進数の有効桁数を以前の設定に戻します。

digits(previoussetting)

qr を使用して、行列形式の方程式系を解くことができます。

方程式系 A*X = b を解きます。ここで、A は 5 行 5 列のシンボリック行列で、b は 5 行 1 列のシンボリック ベクトルです。

A = sym(invhilb(5))
A = 

(25-3001050-1400630-3004800-1890026880-126001050-1890079380-11760056700-140026880-117600179200-88200630-1260056700-8820044100)

b = sym([1:5]')
b = 

(12345)

C = Q'*b かつ A = Q*R となる行列 C と行列 R を求めます。

[C,R] = qr(A,b);

X を計算します。

X = R\C
X = 

(57120197706572801271630)

isAlways を使用して、X が系 A*X = b の解であることを検証します。

tf = isAlways(A*X == b)
tf = 5x1 logical array

   1
   1
   1
   1
   1

浮動小数点数をもつ方程式系を解く際に、置換行列または置換ベクトルをもつ QR 分解を使用します。

方程式系 A*X = b を解きます。ここで、A は 3 行 3 列の可変精度のシンボリック行列で、b は 3 行 1 列の可変精度のシンボリック ベクトルです。C = Q'*b かつ A = Q*R となる行列 C と行列 R を求めます。

previoussetting = digits(10);
A = vpa([2 -3 -1; 1 1 -1; 0 1 -1]);
b = vpa([2; 0; -1]);
[C,R,P] = qr(A,b)
C = 

(-2.110579412-0.21320071640.7071067812)

R = 

(3.316624790.3015113446-1.50755672301.705605731-1.492405014000.7071067812)

P = 3×3

     0     0     1
     1     0     0
     0     1     0

X を計算します。

X = P*(R\C)
X = 

(1.0-0.250.75)

または、置換情報をベクトルとして返します。

[C,R,p] = qr(A,b,"vector")
C = 

(-2.110579412-0.21320071640.7071067812)

R = 

(3.316624790.3015113446-1.50755672301.705605731-1.492405014000.7071067812)

p = 1×3

     2     3     1

置換ベクトル p を使用して解 X を計算します。

X(p,:) = R\C
X = 

(1.0-0.250.75)

10 進数の有効桁数を以前の設定に戻します。

digits(previoussetting)

"econ" オプションを使用して、エコノミーサイズの QR 分解を計算します。

44 列のパスカル行列の最初の 2 列の行列を作成します。

A = sym(pascal(4));
A = A(:,1:2)
A = 

(11121314)

この行列の QR 分解を計算します。

[Q,R] = qr(A)
Q = 

(12-σ131010012-510-2310156612510-31030-6312σ13101566)where  σ1=3510

R = 

(25050000)

次に、この行列のエコノミーサイズの QR 分解を計算します。行数が A の列数より多いため、qrQ の最初の 2 列と R の最初の 2 行のみを計算します。

[Q,R] = qr(A,"econ")
Q = 

(12-351012-51012510123510)

R = 

(2505)

"real" オプションを使用すると、QR 分解の結果で複素共役を回避できます。

シンボリック変数を要素として含む行列を作成します。

syms x
A = [1 2; 3 x]
A = 

(123x)

この行列の QR 分解を計算します。既定の設定では、qrx が複素数を表現すると仮定するので、結果には関数 abs を使用する式が含まれます。

[Q,R] = qr(A)
Q = 

(1010-3x10-95σ131010x10-35σ1)where  σ1=|x10-35|2+|3x10-95|2

R = 

(10103x+2100|x10-35|2+|3x10-95|2)

"real" オプションを使用すると、qr はすべてのシンボリック変数が実数を表現すると仮定するので、より短い結果を返すことができます。

[Q,R] = qr(A,"real")
Q = 

(1010-3x10-95x210-6x5+18531010x10-35x210-6x5+185)

R = 

(10103x+2100x210-6x5+185)

入力引数

すべて折りたたむ

シンボリック入力。m 行 n 列のシンボリック行列として指定します。

シンボリック入力。シンボリック ベクトルまたはシンボリック行列として指定します。BA と同じ行数でなければなりません。

置換出力の形状。"matrix" または "vector" として指定します。このオプションは、置換出力 P が置換行列またはベクトルのいずれとして返されるかを制御します。このオプションを使用するには、qr に 3 つの出力引数を指定しなければなりません。

  • outputForm"matrix" の場合、PA*P = Q*R を満たす置換行列。

  • outputForm"vector" の場合、PA(:,P) = Q*R を満たす置換ベクトル。

出力引数

すべて折りたたむ

QR 分解の R 因子。m 行 n 列の行列 A に対して A = Q*R を満たす上三角シンボリック行列として返されます。

QR 分解の Q 因子。m 行 n 列の行列 A に対して A = Q*R を満たすユニタリ シンボリック行列として返されます。

  • 完全な分解の場合、qr(A)Q を m 行 m 列のユニタリ行列として返す。

  • m > n の方形行列 A の場合、エコノミーサイズの分解 qr(A,"econ") は、Q の最初の n 列と R の最初の n 行のみを計算する。

置換情報。倍精度値の行列またはベクトルとして返されます。P の形状は、outputForm の値によって異なります。

線形系因子。C = Q'*B および X = R\C となる、行列方程式 A*X = B の解を表すシンボリック行列として返されます。置換出力 P を指定した場合、解は、outputForm"matrix" の場合に X = P*(R\C)outputForm"vector" の場合に X(P,:) = R\C となります。

詳細

すべて折りたたむ

行列の QR 分解

QR 分解 (QR decomposition/factorization) は、m 行 n 列の行列 AA = Q*R として表現するものです。完全な分解の場合、Q は m 行 m 列のユニタリ行列で、R は m 行 n 列の上三角行列になります。A の成分が実数の場合、Q は直交行列です。

ヒント

  • 上三角行列 R は、条件 R = chol(A'*A) を満たします。

  • 引数 "econ"0 は、返される行列の形状のみに影響します。

  • シンボリック オブジェクトではない数値行列 (symsyms または vpa により作成されていない行列) で qr を呼び出すと、MATLAB® 関数 qr が起動します。

  • 多くのシンボリック変数が含まれる行列計算は低速になる可能性があります。計算速度を向上させるには、特定の値を変数に代入することでシンボリック変数の数を減らします。

バージョン履歴

R2014a で導入

すべて展開する

参考

| | |