エルミート行列または対称行列 m のBunch–Kaufman分解を,{l,b,p}として与える.
BunchKaufmanDecomposition
エルミート行列または対称行列 m のBunch–Kaufman分解を,{l,b,p}として与える.
詳細とオプション
- Bunch–Kaufman分解は,エルミートソルバあるいは対称ソルバとして,一般に他の分解よりも,より高速でより数値的に安定している.
- Bunch–Kaufman分解はLBLT分解としても知られている.これは,普通はLDLDecompositionを指すLDLT分解として参照されることもある.
の
は
が対角上にある下三角行列,
は
と
のブロックを持つブロック対角行列,
は置換行列である.
の対称性すなわち対角ブロックは入力行列の対称性と一致する. »- もとの行列と分解の関係は,もとの行列がエルミート行列か対称行列かによる.入力がエルミート行列
なら
を満足するが,それが対称行列
なら
になる.実対称行列の場合は,この2つの等式が一致するが,複素対称行列の場合は一致しない. » - BunchKaufmanDecompositionは次のオプションを取る.
-
TargetStructure Automatic 返される行列の構造 - 次は,TargetStructureの可能な設定である.
-
Automatic, "Structured" l をLowerTriangularMatrixオブジェクト,b をBlockDiagonalMatrixオブジェクト,p をPermutationMatrixオブジェクトとして返す "Dense" すべての行列をリストのリストとして返す "Sparse" すべての行列をSparseArrayオブジェクトとして返す - BunchKaufmanDecompositionはLDLDecompositionを,対角行列に
ブロックを導入し置換行列(「ピボット」)を追加するというコストによって,すべてのエルミート行列および対称行列に拡張する. » - エルミート行列
のLDL分解の存在は,
が正定値あるいは負定値に場合は保証されるが,
が不定値の場合は保証されない.Bunch–Kaufman分解によって返される置換行列が恒等行列で
ブロックが存在しない場合は,LDL分解もまた存在する.この分解はBunch–Kaufman分解と等しい.しかし,LDLが存在するがそれがBunch–Kaufman分解とは異なることもある. » - エルミート正定値入力について,Bunch–Kaufman分解は,しばしば,LDL分解と一致する.LDL分解
を使ってコレスキー(Cholesky)分解
が
として構築できるので,BunchKaufmanDecompositionはCholeskyDecompositionのすべてのエルミート行列への拡張とみなすことができる. »
例題
すべて開く すべて閉じる例 (2)
m = (| | | |
| - | - | - |
| 2 | 5 | 4 |
| 5 | 2 | 6 |
| 4 | 6 | 8 |);
{l, b, p} = BunchKaufmanDecomposition[m]MatrixForm /@ %p.m.p == l.b.l複素エルミート行列のBunch–Kaufman分解を計算する:
m = (| | | | |
| ------------ | ------------ | ------------ | ------------ |
| -3.4 | 3.1 + 3.1 I | -2.6 + 2. I | 6. + 3.6 I |
| 3.1 - 3.1 I | -6.3 | -3.1 + 4.5 I | 1.2 + 9.5 I |
| -2.6 - 2. I | -3.1 - 4.5 I | 6.7 | -7.6 - 3.9 I |
| 6. - 3.6 I | 1.2 - 9.5 I | -7.6 + 3.9 I | -8.3 |);
{l, b, p} = BunchKaufmanDecomposition[m]結果をフォーマットする.bの
対角ブロックはエルミート行列である点に注意のこと:
MatrixForm /@ Chop[%]p.m.Transpose[p] - l.b.ConjugateTranspose[l]//Chopスコープ (7)
基本的な用法 (7)
BunchKaufmanDecomposition[Symmetrize[RandomReal[{-10, 10}, {6, 6}], Symmetric[{1, 2}]]]三角行列とブロック対角行列は機械精度であるが,置換行列は厳密精度である:
MatrixForm /@ %機械精度の複素エルミート行列のBunch–Kaufman分解:
SeedRandom[RandomGeneratorState[{"ExtendedCA", {80, 4, 0}},
{{RawArray["UnsignedInteger64", {16407178953997097818, 7368930915502246791, 5756465,
6293977506877026824, 12672308152834613335, 13417613018795460498, 17080942302500744723,
5459500870563 ... 44002455289743, 10936982829512251664, 14835928000192034811,
13752836467989677721, 1054251394126103111, 17310067405974001226, 14978545882044570653,
8934845044304615339}], 4, 0}}, RawArray["UnsignedInteger64", {12505010300297324358, 0}]]];
h = HermitianMatrix@(Symmetrize[RandomComplex[{-10 - 10 * I, 10 + 10 * I}, {6, 6}], Hermitian[{1, 2}]]);{l, b, p} = BunchKaufmanDecomposition[h]
の
ブロックと
ブロックはエルミート行列である.
の主対角要素は実数である:
MatrixForm /@ b["Blocks"]//ChopMinMax[Chop[p.Normal[h].Transpose[p] - l.b.ConjugateTranspose[l]]]s = Symmetrize[RandomComplex[{-10 - 10 * I, 10 + 10 * I}, {20, 20}], Symmetric[{1, 2}]];
{l, b, p} = BunchKaufmanDecomposition[s]
の
ブロックと
ブロックは対称行列である.
の対角には複素要素がある可能性がある:
MatrixForm /@ b["Blocks"]MinMax[Chop[p.s.Transpose[p] - l.b.Transpose[l]]]BunchKaufmanDecompositionを厳密行列に使う:
MatrixForm /@ BunchKaufmanDecomposition[(| | | |
| ----------- | ----------- | ----- |
| 1 | 2 + Sqrt[2] | 3 + π |
| 2 + Sqrt[2] | E | I |
| 3 + π | -I | 0 |)]MatrixForm /@ BunchKaufmanDecomposition[RandomVariate[GaussianOrthogonalMatrixDistribution[3], WorkingPrecision -> 30]]下三角行列とブロック対角行列の精度は,一般に,入力の精度を保持する:
Precision[%]MatrixForm /@ BunchKaufmanDecomposition[(| | |
| ------------ | - |
| 1 | a |
| Conjugate[a] | 5 |)]大きい数値行列のBunch–Kaufman分解は効率的に計算される:.
m = RandomVariate[GaussianOrthogonalMatrixDistribution[1000]];
AbsoluteTiming[BunchKaufmanDecomposition[m];]Dimensions[m]オプション (2)
TargetStructure (2)
mat = Symmetrize[RandomComplex[{-1 - I, 1 + I}, {4, 4}], Hermitian[{1, 2}]];
{l, b, p} = BunchKaufmanDecomposition[mat]これは,TargetStructure "Structured"の設定に等しい:
% === BunchKaufmanDecomposition[mat, TargetStructure -> "Structured"]{l2, b2, p2} = BunchKaufmanDecomposition[mat, TargetStructure -> "Dense"]これらは別のオブジェクトだが,同じ結果を表しており,もとの出力と等しい:
{l2 == l, b2 == b, p2 == p}BunchKaufmanDecomposition[Symmetrize[RandomReal[{-10, 10}, {6, 6}], Symmetric[{1, 2}]], TargetStructure -> "Sparse"]特性と関係 (6)
h = Symmetrize[RandomComplex[1 + I, {3, 3}], Hermitian[{1, 2}]];
{lh, bh, ph} = BunchKaufmanDecomposition[h];
ph.h.ph == lh.bh.lhs = Symmetrize[RandomComplex[1 + I, {3, 3}], Symmetric[{1, 2}]];
{ls, bs, ps} = BunchKaufmanDecomposition[s];
ps.s.ps == ls.bs.ls{ph.h.ph == lh.bh.lh, ps.s.ps == ls.bs.ls}しかし,実対称行列と実エルミート行列は一致するため,実数入力に対しては両方の公式を用いることができる:
r = Symmetrize[RandomReal[1, {3, 3}], Symmetric[{1, 2}]];
{lr, br, pr} = BunchKaufmanDecomposition[r];
HermitianMatrixQ[r] && pr.r.pr == lr.br.lr && pr.r.pr == lr.br.lr置換行列は実直交であるため,入力行列
はエルミート行列の場合は
として復元される:
h = Symmetrize[RandomComplex[1 + I, {3, 3}], Hermitian[{1, 2}]];
{lh, bh, ph} = BunchKaufmanDecomposition[h];
h == ph.lh.bh.lh.phs = Symmetrize[RandomComplex[1 + I, {3, 3}], Symmetric[{1, 2}]];
{ls, bs, ps} = BunchKaufmanDecomposition[s];
s == ps.ls.bs.ls.ps分解におけるブロック対角行列の対称性は入力行列の対称性と一致する:
h = Symmetrize[RandomComplex[1 + I, {20, 20}], Hermitian[{1, 2}]];
{lh, bh, ph} = BunchKaufmanDecomposition[h];
TensorSymmetry[bh]h = Symmetrize[RandomComplex[1 + I, {20, 20}], Symmetric[{1, 2}]];
{lh, bh, ph} = BunchKaufmanDecomposition[h];
TensorSymmetry[bh]BunchKaufmanDecompositionは任意のエルミート行列に対して機能する:
m = (| | | |
| - | - | - |
| 0 | 2 | 1 |
| 2 | 2 | 3 |
| 1 | 3 | 4 |);
HermitianMatrixQ[m]BunchKaufmanDecomposition[mat]LDLDecompositionは,ピボット操作が必要となる場合には,この例のような一部のエルミート行列に対しては失敗する:
LDLDecomposition[m]PositiveDefiniteMatrixQ[m] || NegativeDefiniteMatrixQ[m]以下の行列に対しては,BunchKaufmanDecompositionはピボット選択を使用せず,ブロック対角行列は
ブロックを持たない:
noPivotDiagonal = SymmetrizedArray[StructuredArray`StructuredData[{4, 4},
{{{1, 1} -> 0.9522358578605561, {1, 2} -> 0.6623050421076754, {1, 3} -> 0.17625258657137377,
{1, 4} -> 0.4947848612877843, {2, 2} -> 0.28112053171866624, {2, 3} -> 0.14335614166718358,
{2, 4} -> 0.39283020246124734, {3, 3} -> 0.6313091437316813, {3, 4} -> 0.5768535073588343,
{4, 4} -> 0.9640275388436799}, Hermitian[{1, 2}]}]];
{l, b, p} = BunchKaufmanDecomposition[noPivotDiagonal];
{p == IdentityMatrix[Length[noPivotDiagonal]], DiagonalMatrixQ[b]}その結果,Bunch–Kaufman分解はLDL分解と一致する:
{ℓ, d} = LDLDecomposition[noPivotDiagonal];
l == ℓ && d == b次の行列に対しては,BunchKaufmanDecompositionはピボット操作を使用しないが,
のブロックが存在する:
noPivotBlocks = SymmetrizedArray[StructuredArray`StructuredData[{4, 4},
{{{1, 1} -> 0.31409114975717345, {1, 2} -> 0.9296201158260893, {1, 3} -> 0.4380740997319761,
{1, 4} -> 0.3863400364059515, {2, 2} -> 0.4120399083786235, {2, 3} -> 0.7411387665471949,
{2, 4} -> 0.46915083394191914, {3, 3} -> 0.38601806205067835, {3, 4} -> 0.7551830977005005,
{4, 4} -> 0.23956653728429456}, Hermitian[{1, 2}]}]];
{l, b, p} = BunchKaufmanDecomposition[noPivotBlocks];
{p == IdentityMatrix[Length[noPivotBlocks]], DiagonalMatrixQ[b]}したがって,Bunch–Kaufman分解はLDL分解とは異なる:
{ℓ, d} = LDLDecomposition[noPivotBlocks];
l == ℓ || d == b最後に,次の 行列に対しては,BunchKaufmanDecompositionはピボット を使用する:
pivotDiagonal = SymmetrizedArray[StructuredArray`StructuredData[{4, 4},
{{{1, 1} -> 0.47619054005221373, {1, 2} -> 0.41489787499498676, {1, 3} -> 0.826113894123858,
{1, 4} -> 0.2787158070316167, {2, 2} -> 0.7485827836683288, {2, 3} -> 0.20876586927526475,
{2, 4} -> 0.37069120649409415, {3, 3} -> 0.5480360624388212, {3, 4} -> 0.5333605049010796,
{4, 4} -> 0.19683262635198728}, Hermitian[{1, 2}]}]];
{l, b, p} = BunchKaufmanDecomposition[pivotDiagonal];
{p == IdentityMatrix[Length[pivotDiagonal]], DiagonalMatrixQ[b]}行列
は対角行列であるが,LDLDecomposition によって返される行列
と同一であることは ない:
{ℓ, d} = LDLDecomposition[pivotDiagonal];
l == ℓ || d == bランダムに生成された正定値エルミート行列に対して LDL分解とBunch–Kaufman分解が一致する確率はおよそ
である:
mList = #.#& /@ RandomComplex[1 + I, {1000, 4, 4}];
ldlCoincides[m_] := Module[{l, b, p}, {l, b, p} = BunchKaufmanDecomposition[m];DiagonalMatrixQ[b] && p == IdentityMatrix[Length[m]]]
good = Select[mList, ldlCoincides];
N[Length[good] / Length[mList]]m = First[good];
c = CholeskyDecomposition[m];
{l, b, p} = BunchKaufmanDecomposition[m];
c == Sqrt[b].lこれとは逆に,
は,
の対角を二乗し,さらに
をその対角によって正規化することにより,
および
から構成される:
b == DiagonalMatrix[Diagonal[c]^2] && l == ConjugateTranspose[c / Diagonal[c]]mList === Select[mList, DiagonalMatrixQ[BunchKaufmanDecomposition[#][[2]]]&]したがって,コレスキーを Bunch–Kaufman から復元できない場合,それは自明ではないピボット によるものである:
Last[BunchKaufmanDecomposition[First[Complement[mList, good]]]]関連するガイド
-
▪
- 行列分解
テキスト
Wolfram Research (2026), BunchKaufmanDecomposition, Wolfram言語関数, https://reference.wolfram.com/language/ref/BunchKaufmanDecomposition.html.
CMS
Wolfram Language. 2026. "BunchKaufmanDecomposition." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/BunchKaufmanDecomposition.html.
APA
Wolfram Language. (2026). BunchKaufmanDecomposition. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/BunchKaufmanDecomposition.html
BibTeX
@misc{reference.wolfram_2026_bunchkaufmandecomposition, author="Wolfram Research", title="{BunchKaufmanDecomposition}", year="2026", howpublished="\url{https://reference.wolfram.com/language/ref/BunchKaufmanDecomposition.html}", note=[Accessed: 14-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_bunchkaufmandecomposition, organization={Wolfram Research}, title={BunchKaufmanDecomposition}, year={2026}, url={https://reference.wolfram.com/language/ref/BunchKaufmanDecomposition.html}, note=[Accessed: 14-August-2026]}