Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 如何在Mathematica中以编程方式显示分区矩阵?_Wolfram Mathematica - Fatal编程技术网

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

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

我知道使用“插入”菜单可以创建具有垂直和水平线的矩阵,但不能创建更通用的分区,例如将4x4矩阵划分为4个2x2分区。同样,
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;)