Как заставить MatrixForm отображать строку по горизонтали как вектор реальной строки, а не по вертикали как вектор столбца? - PullRequest
5 голосов
/ 03 января 2012

Есть ли способ заставить MatrixForm отображать вектор строки горизонтально на линии, а не вертикально, как это делается для векторов столбцов? Как это иногда смущает меня. Как вы думаете, будет трудно написать обертку вокруг матрицы, чтобы настроить это поведение?

Например, вот матрица 2 на 2. Строки отображаются так же, как столбцы. Оба показаны в вертикальном положении.

enter image description here

Вопрос: Можно ли заставить MatrixForm отображать векторы строк, расположенные горизонтально, а не вертикально?

Извините, если об этом спрашивали раньше, быстрый поиск ничего не показывает.

спасибо

обновление (1)

Кстати, это в Matlab, он печатает строки по горизонтали и по вертикали автоматически , я надеялся на что-то подобное. Но я пока воспользуюсь предложением Хайке ниже, поскольку оно решает эту проблему за счет небольшого дополнительного набора текста.

enter image description here

обновление (2) Использование решения Hilderic также приятно, мне всегда было трудно печатать 3D-матрицу так, чтобы я мог ее прочитать. Вот он теперь использует {} трюк

enter image description here

Ответы [ 4 ]

6 голосов
/ 03 января 2012

Для arrayname[[All,1]] и arrayname[[1,All]], Part выдает вектор, а MatrixForm не может определить, какую «ориентацию» он имеет. Соответственно, он всегда печатает векторы в виде столбцов.

Единственное, что вы можете сделать, - это предоставить собственную процедуру вывода для векторов строк, например, обернув ее в включающий список, преобразовав ее обратно в (однорядную) матрицу:

rowVector[a_List] := MatrixForm[{a}]
columnVector = MatrixForm   (*for symmetry*)

Вам по-прежнему нужно помнить, произошел ли вектор из строки или столбца.

5 голосов
/ 03 января 2012

Или вы можете просто создать свою собственную функцию RowForm, например:

RowForm[(m_)?VectorQ] := Row[{"(",Row[m,"  "], 
     ")"}, "\[MediumSpace]"]; 

Тогда

RowForm[twoRowsMatrix[[All,1]]]

выглядит нормально

В качестве альтернативы, если вы действительнопросто позаботьтесь о отображении векторов, вы можете сделать:

twoRowsMatrix = {{a11, a12}, {a21, a22}};

TakeColumn[m_?MatrixQ, i_] := (Print[MatrixForm[#]]; #) &@m[[All, i]];
TakeRow[m_?MatrixQ, i_] := (Print[MatrixForm[{#}]]; #) &@m[[i]];
TakeColumn[twoRowsMatrix, 1]
TakeRow[twoRowsMatrix, 1]
0 голосов
/ 11 января 2018

Когда меня это беспокоит, я использую {{a, b, c}}, чтобы указать строку a, b, c (они могут быть любым списком) и транспонировать [{{a, b, c}}] чтобы указать столбец a, b, c.

MatrixForm[a = RandomInteger[{0, 6}, {2, 2}]]
MatrixForm[b = RandomInteger[{0, 6}, {2, 2}]]
MatrixForm[c = RandomInteger[{0, 6}, {2, 2}]]
w = {a, b, c};
MatrixForm[w]
w = {{a, b, c}};
MatrixForm[w]
w = Transpose[{{a, b, c}}];
MatrixForm[w]
0 голосов
/ 19 февраля 2015

Если вам не важна часть (), вы можете добавить ,{}, заключить в фигурные скобки и использовать TableForm или Grid вместо:

vec = {x, y, z};
TableForm[{vec, {}}]
Grid[{vec, {}}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...