BlockDiagonalMatrix[{d1,d2,…}]
対角ブロック diを持つブロック対角行列を構造化配列として表す.
BlockDiagonalMatrix[mat]
ブロック対角行列 mat を構造化配列に変換する.
BlockDiagonalMatrix
BlockDiagonalMatrix[{d1,d2,…}]
対角ブロック diを持つブロック対角行列を構造化配列として表す.
BlockDiagonalMatrix[mat]
ブロック対角行列 mat を構造化配列に変換する.
詳細とオプション
- ブロック対角行列は,構造化配列として表されているときは,Det,Inverse,LinearSolveを含む関数におけるより効率的な保存と操作を可能にする.
- ブロック対角行列は,偏微分方程式の離散化で使用されるように,複数の接続された成分を持つグラフの隣接行列,対角行列を持つ完全な行列のテンソル積(クロネッカー積),ジョルダン分解およびコア零分解の出力として自然に発生する.
- ブロック対角行列は対角行列を一般化する.ここで,対角要素はそれ自体が行列である.
- 対角ブロック diは正方行列でなければならない.
- ブロック対角行列の逆行列もまたブロック対角行列である.
- ブロック対角行列の行列式は対角ブロックの行列式の積である.
- BlockDiagonalMatrix sa については以下の特性"prop" に sa["prop"]でアクセスできる.
-
"Blocks" 対角ブロックのリスト "RowPermutation" 置換リストとして表された行の置換 "ColumnPermutation" 置換リストとして表された列の置換 "Properties" サポートされる特性のリスト "Structure" 構造化配列の型 "StructuredData" 構造化配列によって保存された内部データ "StructuredAlgorithms" 構造化配列についての特別なメソッドがある関数のリスト "Summary" Datasetとして表されたまとめの情報 - Normal[BlockDiagonalMatrix[…]]はブロック対角行列を通常の行列として与える.
- BlockDiagonalMatrix[…,TargetStructure->struct]は,struct で指定された形式でブロック対角行列を返す.次は,使用可能な設定である.
-
Automatic 返す表現を自動選択する "Dense" 行列を密な行列として表す "Sparse" 行列を疎な配列として返す "Structured" 行列を構造化配列として返す - BlockDiagonalMatrix[…,TargetStructureAutomatic]はBlockDiagonalMatrix[…,TargetStructure"Structured"]に等しい.
例題
すべて開く すべて閉じる例 (1)
bd = BlockDiagonalMatrix[{(Subscript[a, 11]), (| | |
| --- | --- |
| b11 | b12 |
| b21 | b22 |)}]MatrixForm[bd]Det[bd]NormalはBlockDiagonalMatrixを通常の表現に変換できる:
Normal[bd]スコープ (6)
BlockDiagonalMatrix[(| | | | | | |
| -- | -- | -- | --- | --- | --- |
| 3. | 5. | 4. | 0. | 0. | 0. |
| 2. | 1. | 7. | 0. | 0. | 0. |
| 6. | 8. | 9. | 0. | 0. | 0. |
| 0. | 0. | 0. | -1. | 0. | 0. |
| 0. | 0. | 0. | 0. | 5. | -2. |
| 0. | 0. | 0. | 0. | -2. | 0. |)]%["Blocks"]BlockDiagonalMatrixオブジェクトは行列に関する情報を与える特性を含む:
bd = BlockDiagonalMatrix[{(| | |
| - | - |
| 3 | 2 |
| 2 | 3 |), (| | | |
| - | - | -- |
| 1 | 2 | 3 |
| 1 | 5 | 6 |
| 1 | 8 | 11 |)}]bd["Properties"]bd["Blocks"]
"RowPermutation"特性はもとの行列に施された行置換を符号化する:
bd["RowPermutation"]"ColumnPermutation"特性はもとの行列に施された列置換を符号化する:
bd["ColumnPermutation"]
"Summary"特性は配列についての情報の簡単なまとめを与える:
bd["Summary"]"StructuredAlgorithms"特性は表現の構造を使う関数のリストを与える:
bd["StructuredAlgorithms"]bn = Normal[SparseArray[Band[{1, 1}] -> Table[RandomReal[{-2, 2}, {1, 1}RandomInteger[{2, 8}]], {22}]]];
bd = BlockDiagonalMatrix[bn];AbsoluteTiming[Det[bn]]AbsoluteTiming[Det[bd]]x = RandomReal[{-9, 9}, Length[bn]];
b = bn.x;AbsoluteTiming[Norm[x - LinearSolve[bn, b]]]AbsoluteTiming[Norm[x - LinearSolve[bd, b]]]AbsoluteTiming[Eigenvalues[bn];]AbsoluteTiming[Eigenvalues[bd];]AbsoluteTiming[SingularValueList[bn];]AbsoluteTiming[SingularValueList[bd];]構造化アルゴリズムは,適切な場合は別のBlockDiagonalMatrixオブジェクトを返す:
bd = BlockDiagonalMatrix[{(| | | |
| - | - | ----- |
| 2 | 3 | 3 - I |
| 0 | 5 | 6 |
| 0 | 0 | 9 |), (| | |
| -- | - |
| 1 | 0 |
| -1 | 1 |)}]Inverse[bd]Transpose[bd]bd にその転置を掛けると別のブロック対角行列が与えられる:
bd.Transpose[bd]BlockDiagonalMatrixの要素は強制的にブロックの非零要素の精度になる:
BlockDiagonalMatrix[{(| | | |
| ----- | ----- | -- |
| 1 | 1 / 3 | -2 |
| 1 / 2 | 2 | 6 |
| 1 | 8 | -1 |), (| | |
| ------ | ------ |
| 8 / 7 | -1 / 3 |
| -1 / 2 | 6 / 5 |)}]//MatrixFormBlockDiagonalMatrix[N[{(| | | |
| ----- | ----- | -- |
| 1 | 1 / 3 | -2 |
| 1 / 2 | 2 | 6 |
| 1 | 8 | -1 |), (| | |
| ------ | ------ |
| 8 / 7 | -1 / 3 |
| -1 / 2 | 6 / 5 |)}]]//MatrixFormBlockDiagonalMatrix[N[{(| | | |
| ----- | ----- | -- |
| 1 | 1 / 3 | -2 |
| 1 / 2 | 2 | 6 |
| 1 | 8 | -1 |), (| | |
| ------ | ------ |
| 8 / 7 | -1 / 3 |
| -1 / 2 | 6 / 5 |)}, 20]]//MatrixFormSparseArrayからブロック対角行列を構築する:
bd = BlockDiagonalMatrix[SparseArray[{{1, 1} -> 3, {1, 2} -> -1, {2, 1} -> 1, {3, 3} -> 2, {4, 4} -> -2, {4, 5} -> 3, {5, 4} -> 3}, {5, 5}]]MatrixForm[bd]オプション (1)
TargetStructure (1)
BlockDiagonalMatrix[{(| | | |
| ----- | ----- | -- |
| 1 | 1 / 3 | -2 |
| 1 / 2 | 2 | 6 |
| 1 | 8 | -1 |), (| | |
| ------ | ------ |
| 8 / 7 | -1 / 3 |
| -1 / 2 | 6 / 5 |)}, TargetStructure -> "Dense"]BlockDiagonalMatrix[{(| | | |
| ----- | ----- | -- |
| 1 | 1 / 3 | -2 |
| 1 / 2 | 2 | 6 |
| 1 | 8 | -1 |), (| | |
| ------ | ------ |
| 8 / 7 | -1 / 3 |
| -1 / 2 | 6 / 5 |)}, TargetStructure -> "Structured"]BlockDiagonalMatrix[{(| | | |
| ----- | ----- | -- |
| 1 | 1 / 3 | -2 |
| 1 / 2 | 2 | 6 |
| 1 | 8 | -1 |), (| | |
| ------ | ------ |
| 8 / 7 | -1 / 3 |
| -1 / 2 | 6 / 5 |)}, TargetStructure -> "Sparse"]アプリケーション (5)
mat = (| | | | |
| -- | - | -- | -- |
| 7 | 1 | -3 | -4 |
| 2 | 1 | -1 | -2 |
| -1 | 0 | 1 | 1 |
| 8 | 1 | -4 | -5 |);
{tm, cm, nm} = CoreNilpotentDecomposition[mat]bm = BlockDiagonalMatrix[{cm, nm}]mat == tm.bm.Inverse[tm]MatrixForm /@ ({s, j} = JordanDecomposition[(| | | | | | |
| -- | -- | -- | -- | -- | -- |
| 4 | 4 | 0 | -2 | -1 | 1 |
| -1 | -1 | 1 | 2 | 2 | 0 |
| -5 | -4 | -1 | 0 | -3 | -3 |
| 5 | 6 | 0 | -2 | 1 | 2 |
| -2 | -4 | 2 | 4 | 3 | 0 |
| 1 | 2 | -2 | -3 | -1 | 1 |)])MatrixForm /@ BlockDiagonalMatrix[j]["Blocks"]対角行列と正方行列のクロネッカー(Kronecker)積はブロック対角行列である:
BlockDiagonalMatrix[KroneckerProduct[(| | | |
| ---- | ---- | ---- |
| [1] | 0 | 0 |
| 0 | [2] | 0 |
| 0 | 0 | [3] |), (| | | | |
| ----- | ----- | ----- | ----- |
| C[11] | C[12] | C[13] | C[14] |
| C[21] | C[22] | C[23] | C[24] |
| C[31] | C[32] | C[33] | C[34] |
| C[41] | C[42] | C[43] | C[44] |)]]MatrixForm[%]g = GraphData[{"QuinticDisconnected", {14, 2}}]非連結グラフは,ブロック対角行列として表すことができる隣接行列を持つ:
adj = BlockDiagonalMatrix[AdjacencyMatrix[g]]c1 = AdjacencyGraph /@ adj["Blocks"]これはConnectedGraphComponentsを使うことに等しい:
c2 = ConnectedGraphComponents[g]//SortBy[VertexCount]MapThread[IsomorphicGraphQ, {c1, c2}]高速フーリエ変換(FFT)の効率は2つの小さいフーリエ行列から大きいフーリエ行列が形成できる点にかかっている.大きさが p と q の2つの小さいフーリエ行列を生成する:
p = 2;
MatrixForm[fmatp = FourierMatrix[p]]q = 3;
MatrixForm[fmatq = FourierMatrix[q]]大きさが p q のフーリエ行列は,より単純な4つの行列の積として表すことができる:
fpkp = KroneckerProduct[fmatp, IdentityMatrix[q]];
diag = DiagonalMatrix[Flatten[Table[Exp[(2 π I j k/p q)], {k, 0, p - 1}, {j, 0, q - 1}]]];
fqkp = BlockDiagonalMatrix[ConstantArray[fmatq, p]];
shuffle = PermutationMatrix[Flatten[Partition[Range[p q], p], {{2, 1}}]];
MatrixForm[fmatpq = fpkp.diag.fqkp.shuffle]結果の行列がFourierMatrixの結果と等しいことを示す:
fmatpq == FourierMatrix[p q]ベクトルの離散フーリエ変換はフーリエ行列の因子を連続的にベクトルに掛けることで計算できる:
data = RandomComplex[1 + I, p q];
res = fpkp.(diag.(fqkp.(shuffle.data)))結果はFourierをベクトルに適用したものと等しい:
Chop[Max[Abs[res - Fourier[data]]]] == 0特性と関係 (4)
SparseArray[BlockDiagonalMatrix[…]]を使ってSparseArrayとしての表現を得る:
SparseArray[BlockDiagonalMatrix[{(| | |
| - | - |
| 3 | 2 |
| 2 | 3 |), (| | | |
| - | - | -- |
| 1 | 2 | 3 |
| 1 | 5 | 6 |
| 1 | 8 | 11 |)}]]対角行列は1×1ブロックを持つブロック対角行列として扱われる:
bd = BlockDiagonalMatrix[DiagonalMatrix[{1, 2, 3}]]bd["Blocks"]BlockDiagonalMatrixブロックを持つBlockDiagonalMatrixオブジェクトは単一のBlockDiagonalMatrixオブジェクトに平坦化される:
bd1 = BlockDiagonalMatrix[{HilbertMatrix[2], {{1}}, ToeplitzMatrix[3]}];
bd2 = BlockDiagonalMatrix[{HilbertMatrix[3], {{-1}}, ToeplitzMatrix[2]}];
bd3 = BlockDiagonalMatrix[{bd1, bd2}]MatrixForm /@ bd3["Blocks"]BlockDiagonalMatrixは,与えられた行列が対角ブロックに分割できない場合,あるいは対角ブロックの形式に変換できない場合は行列そのものを返す:
BlockDiagonalMatrix[HilbertMatrix[3]]関連するガイド
-
▪
- 構造化配列
テキスト
Wolfram Research (2022), BlockDiagonalMatrix, Wolfram言語関数, https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html (2023年に更新).
CMS
Wolfram Language. 2022. "BlockDiagonalMatrix." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2023. https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html.
APA
Wolfram Language. (2022). BlockDiagonalMatrix. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html
BibTeX
@misc{reference.wolfram_2026_blockdiagonalmatrix, author="Wolfram Research", title="{BlockDiagonalMatrix}", year="2023", howpublished="\url{https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html}", note=[Accessed: 09-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_blockdiagonalmatrix, organization={Wolfram Research}, title={BlockDiagonalMatrix}, year={2023}, url={https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html}, note=[Accessed: 09-August-2026]}