Как вы программно отображаете секционированную матрицу в Mathematica? - PullRequest
3 голосов
/ 20 октября 2010

Я знаю, что с помощью меню «Вставка» вы можете создать матрицу с вертикальными и горизонтальными линиями, но не более общий раздел, такой как разделение матрицы 4x4 на 4 раздела 2x2. Кроме того, MatrixForm не может выполнять какие-либо виды разбиения. Итак, как бы я пошел о программном отображении такой многораздельной матрицы? Я хотел бы сохранить способность MatrixForm действовать только как оболочка и не влиять на последующие оценки, но это не является строго необходимым. Я подозреваю, что это будет связано с использованием Grid, но я не пробовал.

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

После слишком долгой игры, пытаясь заставить Interpretation отбросить отображаемую форму и использовать матрицу при использовании в последующих строках, я сдался и просто сделал оболочку, которая работает почти так же, как MatrixForm. Это было действительно быстро, так как это была простая модификация этого вопроса .

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]& выдаст запрошенное разбиение 2x2 матрицы 4x4. Может быть полезно изменить значения по умолчанию pMatrixForm с отсутствия разделов на центральные разделы. Это не будет трудно.

3 голосов
/ 20 октября 2010

Так вот что я придумал. Для матрицы М:

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]}] &;

Это принимает три аргумента; сначала матрица, затем список позиций для разделителей столбцов и, в-третьих, список значений для разделителей строк.

Чтобы он хорошо отображался, просто оберните его в браслеты и используйте MatrixForm:

MatrixForm@{partMatrix[M, {3}, {3}]}

Что делает разделение 2by2, которое вы упомянули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...