QR分解を{q,r}ペアとして与える.q はユニタリ行列,そして r は上三角行列となる.
QRDecomposition[m,Full]
m が正方行列ではない場合でも,完全なQR分解を返す.
QRDecomposition
QR分解を{q,r}ペアとして与える.q はユニタリ行列,そして r は上三角行列となる.
QRDecomposition[m,Full]
m が正方行列ではない場合でも,完全なQR分解を返す.
詳細とオプション
- もとの行列 m はConjugateTranspose[q].r と同値である.これは,m が実数の場合はTranspose[q].r と簡約できる. »
- この行列 q はユニタリ行列である.入力が実数なら,q は実直交行列でもある. »
の列数は常に
の行数に等しく,
と
は常に同数の列を持つ. »- QRDecomposition[m]を使うときは.q と r の行数はどちらもMatrixRank[m]に等しい. »
- QRDecomposition[m,Full]を使うときは,行列 q は常に正方行列で, r と m の次元は等しい. »
- QRDecompositionは以下のオプションを取る.
-
Pivoting False ピボットを使うかどうか TargetStructure Automatic 返される行列の構造 - QRDecomposition[m,Pivoting->True]は,リスト{q,r,p}を作成する.p は m.p が ConjugateTranspose[q].r と等しくなるような置換行列である. »
- 次は,TargetStructureの可能な設定である.
-
Automatic 自動設定 "Dense" すべての行列をリストのリストとして返す "Sparse" すべての行列をSparseArrayオブジェクトとして返す "Structured" r をUpperTriangularMatrixオブジェクト,q をUnitaryMatrixオブジェクトまたはOrthogonalMatrixオブジェクト,p をPermutationMatrixオブジェクトとして返す - 設定TargetStructure"Structured"を用いる場合,q がUnitaryMatrixオブジェクトとして返されるかOrthogonalMatrixオブジェクトとして返されるかは,入力が実数であったかどうかに依存する.
例題
すべて開く すべて閉じる例 (3)
m = (| | |
| - | - |
| 1 | 2 |
| 3 | 4 |);
{q, r} = QRDecomposition[m];
{q//MatrixForm, r//MatrixForm}m == ConjugateTranspose[q].r{q, r} = QRDecomposition[(| | |
| - | - |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |)];
{q//MatrixForm, r//MatrixForm}Transpose[q].r//MatrixForm{q, r} = QRDecomposition[(| | | |
| -- | -- | -- |
| 1. | 2. | 3. |
| 4. | 5. | 6. |)];
{q//MatrixForm, r//MatrixForm}Transpose[q].r//MatrixFormスコープ (13)
基本的な用法 (6)
QRDecomposition[{{1.2, 2.3, 3.4}, {2.3, 4.5, 5.6}, {3.2, 7.6, 6.5}}]Map[MatrixForm, %]m = (| | | |
| -------------- | -------------- | -------------- |
| 0.18 + 0.26 I | 0.22 + 0.19 I | 0.4 + 0.26 I |
| 0.26 + 0.54 I | 0.79 + 0.43 I | 0.14 + 0.26 I |
| 0.63 + 0.64 I | 0.33 + 0.42 I | 0.52 + 0.12 I |);
{q, r} = QRDecomposition[m];
MatrixForm /@ %ConjugateTransposeを使って分解を検証する:
ConjugateTranspose[q].r == mQRDecompositionを厳密行列に使う:
MatrixForm /@ QRDecomposition[{{3, 1, 5}, {2, 4, 6}, {8, 7, 9}}]MatrixForm /@ QRDecomposition[RandomReal[5, {3, 3}, WorkingPrecision -> 10]]QRDecompositionを記号行列に使う:
FullSimplify[QRDecomposition[{{a, b}, {c, d}}], {a, b, c, d}∈ℝ]mat = RandomReal[{0, 9}, {1000, 1000}];AbsoluteTiming[QRDecomposition[mat];]完全分解 (3)
m = (| | | |
| - | - | - |
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |);
MatrixRank[m]QRDecomposition[m]は矩形行列を与える:
{qt, rt} = QRDecomposition[m];
MatrixForm /@ %QRDecomposition[m,Full]は追加の行を加え,q を正方とし,r を m と同じ形状にする:
{qf, rf} = QRDecomposition[m, Full];
MatrixForm /@ %qt.rt == m == qf.rfqt == qf[[1 ;; 2]] && rt == rf[[1 ;; 2]]rf[[3 ;; ]]m = (| | |
| - | - |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |);
MatrixForm /@ QRDecomposition[m]MatrixForm /@ QRDecomposition[(| | |
| - | - |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |), Full]これは,背が高い行列は決して完全な行の階数を持たないからである:
MatrixRank[m] < Length[m]m = (| | | |
| - | - | - |
| 1 | 2 | 3 |
| 4 | 5 | 6 |);
QRDecomposition[m] == QRDecomposition[m, Full]MatrixRank[m] == Length[m]d = (| | | |
| - | - | - |
| 1 | 2 | 3 |
| 2 | 4 | 6 |);
QRDecomposition[d] == QRDecomposition[d, Full]MatrixRank[d] < Length[d]特殊行列 (4)
SparseArray[{{1, 3} -> 1, {2, 2} -> 2, {3, 1} -> 3}, {3, 3}]QRDecomposition[%]SparseArray[{{x_, y_} /; Abs[x - y] < 3 -> 3}, {5, 5}]Map[MatrixForm, QRDecomposition[%]]SymmetrizedArray[{{1, 1} -> 2, {1, 2} -> 1}, {2, 2}, Symmetric[All]]QRDecomposition[%]一貫した単位を持つQuantityArray構造化行列に使う:
QuantityArray[{{1, 4}, {3, 5}}, "Meters"]QRDecomposition[%]m が恒等行列のときのQRDecomposition[m]は2つの恒等行列からなっている:
QRDecomposition[IdentityMatrix[3]]QRDecomposition[IdentityMatrix[{3, 4}]]HilbertMatrixのQR分解:
Map[MatrixForm, QRDecomposition[HilbertMatrix[3]]]オプション (4)
Pivoting (1)
m = (| | | | |
| :- | :- | :- | :- |
| 1 | 2 | 3 | 4 |
| 1 | 4 | 9 | 16 |
| 1 | 8 | 27 | 64 |);
{q, r, p} = QRDecomposition[N[m], Pivoting -> True]MatrixForm[r]MatrixForm[p]QRDecompositionはm.p==ConjugateTranspose[q].rを満足する:
ConjugateTranspose[q].r - m.p//ChopTargetStructure (3)
デフォルト設定のとき,QRDecompositionは,実入力に対して2つの密な行列のリスとを返す:
ma = RandomReal[1, {5, 3}];
QRDecomposition[ma]TargetStructure->"Structured"のとき,結果はOrthogonalMatrixオブジェクトおよびUpperTriangularMatrixオブジェクトになる:
QRDecomposition[ma, TargetStructure -> "Structured"]TargetStructureのデフォルト設定では,ピボット行列がSparseArrayオブジェクトとして返される:
ma = RandomReal[1, {5, 3}];
QRDecomposition[ma, Pivoting -> True]TargetStructure"Dense"を使って3つの行列を通常のリストのリストとして取得する:
QRDecomposition[ma, Pivoting -> True, TargetStructure -> "Dense"]TargetStructure->"Structured"の設定のとき,実入力の結果は OrthogonalMatrix,UpperTriangularMatrix,PermutationMatrixの3つのオブジェクトである:
QRDecomposition[ma, Pivoting -> True, TargetStructure -> "Structured"]複素入力でTargetStructure->"Structured"のときm,QRDecompositionはUnitaryMatrixオブジェクトとUpperTriangularMatrixオブジェクトのペアを返す:
ma = RandomComplex[1 + I, {6, 4}];
QRDecomposition[ma, TargetStructure -> "Structured"]QRDecomposition[ma, TargetStructure -> "Sparse"]アプリケーション (8)
QR分解の幾何学 (4)
次の行列
の列空間の直交基底を求め,その基底を使って
のQR分解を求める:
a = (| | | |
| -- | -- | -- |
| 1 | 3 | 7 |
| -1 | 2 | -3 |
| -1 | 2 | -9 |
| 1 | -4 | 7 |
| 1 | 2 | 1 |);{n, m} = Dimensions[a]
を
の
番目の列とし,
を対応するグラム・シュミット(Gram–Schmidt)基底の
番目の要素として定義する:
Table[v[k] = a[[All, k]], {k, m}];Table[e[k] = Normalize[v[k] - Underoverscript[∑, j = 1, k - 1]Projection[v[k], e[j]]], {k, m}]//MatrixFormq = %;(r = Table[e[i].v[j], {i, m}, {j, m}])//MatrixFormTranspose[q].r == aこれはQRDecompositionが与える結果に等しい:
{q, r} == QRDecomposition[a]次の行列
について,OrthogonalizeとQRDecompositionを使って求まったQR分解を比較する:
a = (| | | |
| - | - | - |
| 7 | 1 | 1 |
| 2 | 0 | 0 |
| 9 | 4 | 1 |);
はOrthogonalizeを
の列に適用した結果とする:
MatrixForm[q = Orthogonalize[Transpose[a]]](r = q.a)//MatrixFormTranspose[q].r == aこれはQRDecompositionが与える結果に等しい:
{q, r} == QRDecomposition[a]次の行列
について,OrthogonalizeとQRDecompositionを使って求まったQR分解を比較する:
a = (| | | |
| ------------------------------------------ | ------------------------------------------- | ------------------------------------------ |
| 0.3777175008628273 + 0.7554306035890215 I | 0.042448606227943886 + 0.6597841389667563 I | 0.5294306313261885 + 0.9489845876390817 I |
| 0.06926665232206441 + 0.7454105710412986 I | 0.3752984378635884 + 0.07592515378172049 I | 0.934180626643051 + 0.6965119371223651 I |
| 0.3003335850354458 + 0.8656874330066835 I | 0.5891726583893067 + 0.4589922313534083 I | 0.8285542124029186 + 0.32894896452410505 I |);
はOrthogonalizeを
の複素共役列に適用した結果とする:
MatrixForm[q = Orthogonalize[ConjugateTranspose[a]]](r = q.a//Chop)//MatrixFormConjugateTranspose[q].r == aこれは,QRDecompositionが与える結果と符号まで等しい:
MatrixForm /@ QRDecomposition[a]アプリケーションによっては,
が正方(かつユニタリ)行列で
が入力行列と同じ次元である,いわゆる完全QR分解を計算すると便利なことがある.次の行列
の完全QR分解を計算する:
m = (| | | |
| ----- | ----- | ----- |
| 1 | 2 | 3 |
| 4 I | 5 I | 6 I |
| -7 | -8 | -9 |
| -10 I | -11 I | -12 I |);線形独立の列は2列しかないので,
と
はそれぞれ2行しか持たない:
{q, r} = QRDecomposition[m];
{q//MatrixForm, r//MatrixForm}NullSpaceを使って
の列のスパンの外にあるベクトルを求め,完全集合を直交化する:
MatrixForm[qF = Orthogonalize[Join[q, NullSpace[q]]]]UnitaryMatrixQ[qF]MatrixForm[rF = PadRight[r, Dimensions[m]]]ConjugateTranspose[qF].rF == m最小二乗と曲線のフィット (4)
次の行列
とベクトル
について,QR分解を使って
を最小にする
を求める:
m = (| | | |
| -- | -- | -- |
| 2 | -2 | -2 |
| -2 | 2 | 0 |
| 2 | -2 | 0 |
| 2 | 2 | 0 |
| 2 | 1 | -1 |);
b = {6, 1, 4, 9, 0};{q, r} = QRDecomposition[m];
{q//MatrixForm, r//MatrixForm}Transpose[m].m == Transpose[r].r
は(
の列が線形独立であるために)可逆なので,解は
である:
Inverse[r].q.bLeastSquaresを使って結果を確認する:
% == LeastSquares[m, b]m = (| | | | | |
| -- | -- | -- | -- | -- |
| 0 | 0 | -1 | -1 | 1 |
| -2 | -1 | -1 | 1 | 0 |
| 0 | -2 | -2 | 0 | -1 |);
b = {7, 9, 0};
のQR分解を計算すると,
に線形独立の行があるので可逆な
が与えられる:
{q, r} = QRDecomposition[Transpose[m]];
{q//MatrixForm, r//MatrixForm}x = Transpose[q].Inverse[Transpose[r]].b//FullSimplifym.x == bQRDecompositionを使ってデータに最もフィットする曲線が求められる.次のデータについて考える:
data = IconizedObject[«Data»];
ListPlot[data]{x, y} = Extract[data, {{All, 1}, {All, 2}}];
を最小化することが曲線
をフィットすることになるように,
が列
と
を持つとする:
m = Map[x |-> {1, x}, x];
の列は線形独立なので,線形最小二乗フィットの係数は
である:
{q, r} = QRDecomposition[m];
{a, b} = Inverse[r].q.yFitを使って係数を確認する:
Fit[data, {1, s}, s]Show[Plot[a + b x, {x, 0, 1}], ListPlot[data]]data = IconizedObject[«Data»];
ListPlot[data]{x, y} = Extract[data, {{All, 1}, {All, 2}}];
の最小化が
へのフィットになるように.
が列
,
,
を持つとする:
m = Map[x |-> {1, x, x ^ 2}, x];{q, r} = QRDecomposition[m];
{a, b, c} = Inverse[r].q.yFitを使って係数を確認する:
Fit[data, {1, s, s ^ 2}, s]Show[Plot[a + b x + c x ^ 2, {x, 0, 3}], ListPlot[data]]特性と関係 (12)
もとの行列はConjugateTranspose[q].r に等しい:
mℂ = RandomComplex[1 + I, {3, 4}];
{qℂ, rℂ} = QRDecomposition[mℂ];
Chop[mℂ - ConjugateTranspose[qℂ].rℂ]これは,入力が実数のときはTranspose[q].r に簡約できる:
mℝ = RandomReal[1, {3, 4}];
{qℝ, rℝ} = QRDecomposition[mℝ];
Chop[mℝ - Transpose[qℝ].rℝ]{qℂ, rℂ} = QRDecomposition[RandomComplex[1 + I, {3, 4}]];
UnitaryMatrixQ[q]{qℝ, rℝ} = QRDecomposition[RandomReal[1, {3, 4}]];
OrthogonalMatrixQ[q] && Element[q, Reals]UpperTriangularMatrixQ[rℂ] && UpperTriangularMatrixQ[rℝ]
が
行列なら,
行列には
列,
行列には
列あることになる:
a = RandomReal[1, {3, 5}];
{n, m} = Dimensions[a];
{q, r} = QRDecomposition[a];
n == Last[Dimensions[q]] && m == Last[Dimensions[r]]QRDecompositionは
と
がMatrixRank[m]行を持つ「薄い」分解を計算する:
m = (| | | | |
| - | -- | -- | -- |
| 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 |);
{q, r} = QRDecomposition[m];
MatrixRank[m] == Length[q] == Length[r]{q//MatrixForm, r//MatrixForm}QRDecomposition[m,Full]は,次元が m と等しい r 行列を与える:
m = (| | | | |
| - | -- | -- | -- |
| 1 | 2 | 3 | 4 |
| 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 |);
{q, r} = QRDecomposition[m, Full];
Dimensions[r] == Dimensions[m]SquareMatrixQ[q] && Length[q] == Length[m]{q//MatrixForm, r//MatrixForm}m が実数値を持つ可逆行列なら,そのQR分解の
行列は正方直交行列である:
m = RandomReal[1, {5, 5}];
MatrixRank[m] == 5{q, r} = QRDecomposition[m];
SquareMatrixQ[q] && OrthogonalMatrixQ[q]m が可逆行列なら.そのQR分解の
行列は正方ユニタリ行列である:
m = RandomComplex[1 + I, {5, 5}];
MatrixRank[m] == 5{q, r} = QRDecomposition[m];
SquareMatrixQ[q] && UnitaryMatrixQ[q]a が
行列で MatrixRank[a]==n なら,そのQR分解の
行列は正方ユニタリ行列である:
a = RandomComplex[1 + I, {3, 5}];
{n, m} = Dimensions[a];
MatrixRank[a] == n{q, r} = QRDecomposition[a];
SquareMatrixQ[q] && UnitaryMatrixQ[q]a が
行列でMatrixRank[a]==m なら,そのQR分解の
行列は可逆行列である:
a = RandomReal[1, {5, 3}];
{n, m} = Dimensions[a];
MatrixRank[a] == m{q, r} = QRDecomposition[a];
Det[r] != 0さらに,PseudoInverse[a]==Inverse[r].q でもある:
PseudoInverse[a] - Inverse[r].q//ChopOrthogonalizeを使ってQR分解が計算できる:
m = RandomComplex[1 + I, {5, 5}];
q = Orthogonalize[ConjugateTranspose[m]];
r = q.m;
m == ConjugateTranspose[q].r && UnitaryMatrixQ[q] && UpperTriangularMatrixQ[r]近似行列は,通常は,QRDecompositionで求まったものとは異なる:
{q, r} == QRDecomposition[m]LeastSquaresとQRDecompositionはどちらも最小二乗問題を解くために使うことができる:
m = {{1, 2}, {3, 4}, {1, 1}};
b = {1, 2, 3};
{q, r} = QRDecomposition[m];LeastSquares[m, b] == Inverse[r].q.b
のコレスキー(Cholesky)分解は
QR分解と位相まで一致する:
m = RandomComplex[1 + I, {6, 3}];CholeskyDecomposition[ConjugateTranspose[m].]m を計算する:
u = CholeskyDecomposition[ConjugateTranspose[m].m];{q, r} = QRDecomposition[m];Chop[r Sign[Tr[r, List]] - u]テクニカルノート
履歴
1991 で導入 (2.0) | 2026 で更新 (15.0)
テキスト
Wolfram Research (1991), QRDecomposition, Wolfram言語関数, https://reference.wolfram.com/language/ref/QRDecomposition.html (2026年に更新).
CMS
Wolfram Language. 1991. "QRDecomposition." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2026. https://reference.wolfram.com/language/ref/QRDecomposition.html.
APA
Wolfram Language. (1991). QRDecomposition. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/QRDecomposition.html
BibTeX
@misc{reference.wolfram_2026_qrdecomposition, author="Wolfram Research", title="{QRDecomposition}", year="2026", howpublished="\url{https://reference.wolfram.com/language/ref/QRDecomposition.html}", note=[Accessed: 03-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_qrdecomposition, organization={Wolfram Research}, title={QRDecomposition}, year={2026}, url={https://reference.wolfram.com/language/ref/QRDecomposition.html}, note=[Accessed: 03-November-2026]}