BlockDiagonalMatrix[{d1,d2,…}]
表示块对角矩阵,其中对角块 di 作为结构化数组.
BlockDiagonalMatrix[mat]
将块对角矩阵 mat 转换为结构化数组.
BlockDiagonalMatrix
BlockDiagonalMatrix[{d1,d2,…}]
表示块对角矩阵,其中对角块 di 作为结构化数组.
BlockDiagonalMatrix[mat]
将块对角矩阵 mat 转换为结构化数组.
更多信息和选项
- 块对角矩阵,当表示为结构化数组时,允许高效存储和更高效的运算,包括 Det、Inverse 和 LinearSolve.
- 块对角矩阵作为具有多个连通分量的图的邻接矩阵、作为具有对角矩阵的全矩阵的张量积(克罗内克积)以及作为 Jordan 分解和核心-幂零分解的输出而自然出现.
- 块对角矩阵是广义的对角矩阵,其中对角元素本身就是矩阵.
- 对角块 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"]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.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]]//MatrixForm从 SparseArray 构造块对角矩阵:
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"]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) 的效率取决于从两个较小的傅立叶矩阵形成更大的傅立叶矩阵的能力. 生成两个大小为 p 和 q 的小傅立叶矩阵:
p = 2;
MatrixForm[fmatp = FourierMatrix[p]]q = 3;
MatrixForm[fmatq = FourierMatrix[q]]大小为 p q 的傅立叶矩阵可以表示为四个更简单矩阵的乘积:
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 |)}]]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 语言. 2022. "BlockDiagonalMatrix." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2023. https://reference.wolfram.com/language/ref/BlockDiagonalMatrix.html.
APA
Wolfram 语言. (2022). BlockDiagonalMatrix. Wolfram 语言与系统参考资料中心. 追溯自 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: 18-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: 18-August-2026]}