我知道使用“插入”菜单,您可以创建具有垂直和水平线的矩阵,但不能创建更通用的分区,例如将4x4矩阵划分为4个2x2分区。也不能MatrixForm
进行任何分区。那么,我将如何以编程方式显示这样的分区矩阵?我希望保留MatrixForm
仅作为包装器而不影响后续评估的能力,但这并非绝对必要。我怀疑这会涉及使用Grid
,但我还没有尝试过。
答案 0 :(得分:3)
所以这就是我想出来的。对于矩阵M:
M = {{a, b, 0, 0}, {c, d, 0, 0}, {0, 0, x, y}, {0, 0, z, w}};
你构造两个True / False值列表(对于你想要分隔符的地方为True),它带有两个参数;首先是矩阵,然后是分隔符的位置列表。
colSep = Fold[ReplacePart[#1, #2 -> True] &,
Table[False, {First@Dimensions@#1 + 1}], #2] &;
rowSep = Fold[ReplacePart[#1, #2 -> True] &,
Table[False, {Last@Dimensions@#1 + 1}], #2] &;
现在使用Grid[]
使用Dividers
进行分区视图:
partMatrix = Grid[#1, Dividers -> {colSep[#1, #2], rowSep[#1, #3]}] &;
这需要三个论点;首先是矩阵,第二是列分隔符的位置列表,第三是行分隔符的值列表。
为了让它显示得很好,你只需将它包装在brakets中并使用MatrixForm:
MatrixForm@{partMatrix[M, {3}, {3}]}
您提到的2by2分区是哪个。
答案 1 :(得分:3)
在玩了很长时间试图让Interpretation
删除显示的表单并在后续行中使用矩阵后,我放弃了,只是制作了一个几乎与MatrixForm
完全相同的包装器。这真的很快,因为它是this question的简单修改。
Clear[pMatrixForm,pMatrixFormHelper]
pMatrixForm[mat_,col_Integer,row_:{}]:=pMatrixForm[mat,{col},row]
pMatrixForm[mat_,col_,row_Integer]:=pMatrixForm[mat,col,{row}]
pMatrixFormHelper[mat_,col_,row_]:=Interpretation[MatrixForm[
{Grid[mat,Dividers->{Thread[col->True],Thread[row->True]}]}],mat]
pMatrixForm[mat_?MatrixQ,col:{___Integer}:{},row:{___Integer}:{}]:=
(CellPrint[ExpressionCell[pMatrixFormHelper[mat,col,row],
"Output",CellLabel->StringJoin["Out[",ToString[$Line],"]//pMatrixForm="]]];
Unprotect[Out];Out[$Line]=mat;Protect[Out];mat;)
然后后缀命令//pMatrixForm[#, 3, 3]&
将为4x4矩阵提供所请求的2x2分区。将pMatrixForm
的默认值从无分区更改为中央分区可能很有用。这不会很难。