Так вот что я придумал. Для матрицы М:
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, которое вы упомянули.