如何以编程方式在Mathematica中显示分区矩阵?

时间:2010-10-20 13:08:44

标签: wolfram-mathematica

我知道使用“插入”菜单,您可以创建具有垂直和水平线的矩阵,但不能创建更通用的分区,例如将4x4矩阵划分为4个2x2分区。也不能MatrixForm进行任何分区。那么,我将如何以编程方式显示这样的分区矩阵?我希望保留MatrixForm仅作为包装器而不影响后续评估的能力,但这并非绝对必要。我怀疑这会涉及使用Grid,但我还没有尝试过。

2 个答案:

答案 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的默认值从无分区更改为中央分区可能很有用。这不会很难。