Wolfram mathematica 如何在Mathematica中以编程方式显示分区矩阵?
我知道使用“插入”菜单可以创建具有垂直和水平线的矩阵,但不能创建更通用的分区,例如将4x4矩阵划分为4个2x2分区。同样,Wolfram mathematica 如何在Mathematica中以编程方式显示分区矩阵?,wolfram-mathematica,Wolfram Mathematica,我知道使用“插入”菜单可以创建具有垂直和水平线的矩阵,但不能创建更通用的分区,例如将4x4矩阵划分为4个2x2分区。同样,MatrixForm也不能进行任何类型的分区。那么,我如何以编程方式显示这样一个分区矩阵呢?我希望保留MatrixForm的功能,只作为包装器,不影响后续的评估,但这并不是严格必要的。我怀疑这会涉及到使用网格,但我还没有尝试过。所以这就是我想到的。对于矩阵M: M = {{a, b, 0, 0}, {c, d, 0, 0}, {0, 0, x, y}, {0, 0, z, w
MatrixForm
也不能进行任何类型的分区。那么,我如何以编程方式显示这样一个分区矩阵呢?我希望保留MatrixForm
的功能,只作为包装器,不影响后续的评估,但这并不是严格必要的。我怀疑这会涉及到使用网格,但我还没有尝试过。所以这就是我想到的。对于矩阵M:
M = {{a, b, 0, 0}, {c, d, 0, 0}, {0, 0, x, y}, {0, 0, z, w}};
构造两个包含两个参数的真/假值列表(需要分隔符的位置为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[]
的分区视图是使用分隔符制作的:
partMatrix = Grid[#1, Dividers -> {colSep[#1, #2], rowSep[#1, #3]}] &;
这需要三个论点;第一个是矩阵,第二个是列分隔符的位置列表,第三个是行分隔符的值列表
为了更好地显示,您只需将其包装在brakets中并使用MatrixForm:
MatrixForm@{partMatrix[M, {3}, {3}]}
你提到的2by2分区是哪个 在尝试进行解释
太长时间后,我放弃了在后续行中使用矩阵,只做了一个与MatrixForm
几乎完全相同的包装器。这真的很快,因为这是一个简单的修改
然后postfix命令//pMatrixForm[#,3,3]&
将给出4x4矩阵请求的2x2分区。将pMatrixForm
的默认值从无分区更改为中心分区可能很有用。这并不难。我必须花一些时间研究它到底是如何工作的,但它确实很聪明。尽管如此,您确实失去了可以直接使用其结果的MatrixForm
的良好功能。给我几个小时再投票。Dividers
选项也可以为Dividers选择一个位置列表,你甚至可以使用样式:Grid[M,Dividers->{{3->True},{3->Red}]
好主意,我在那里做的折叠只是第一次尝试。如果你编写了一个更好的partMatrix版本,你可以让它选择性地继承除数选项符号。要回到最初的难题(可能这本身就是一个问题),有没有办法让Mathematica中的对象在显示时与求值时具有不同且独立的形式?@Michael,例如,可以通过线程[{3,4}->True]
轻松实现。这样就不需要使用colSep
和rowSep
来指定形式为:{{index..},style}
的除法器规格。另外,{{index,style}..}
可以通过规则@@{{index,style}..}
轻松处理。实际上,pMatrix表单应该继承网格的参数结构-然后它们都可以简单地传递。稍后我可能会重写它。有一个输入错误,pMatrixForm
的整个函数体必须用parantises包装。(您有结束符,但没有开始符。)也就是说,通过Out[]
引用输出效果与预期一样。但是,设置p=pMatrixForm[M,3,3]
将p
设置为Null
。这和我要找的很接近。谢谢你帮我挑错了。使用p=MatrixForm[M]
或p=pMatrixForm[M,3,3]
通常是个坏主意,因为这样你就不能用p
做太多事情了。最好使用类似于(p=M)//pMatrixForm[#,3,3]&
或等效的pMatrixForm[p=M,3,3]
。如果确实要将p=pMatrixForm[M,3,3]
设置为表示p=M
的意思,可以删除最后的分号,然后在使用它的表达式中抑制输出。如果您想将p
设置为排版格式,那么只需使用我的pMatrixFormHelper
。好吧,现在我必须将这个问题添加到我的收藏夹:)。西蒙,谢谢你的教育,我得好好玩玩,看看这是怎么回事。但是,这绝对是一个很好的解决方案。
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;)