Я думаю, что в системе Mathematica предпочтение отдается строкам, а не столбцам.
Учитывая матрицу, вставить строку кажется легко, просто используйте Insert []
(a = {{1, 2, 3}, {4, 0, 8}, {7 , 8, 0}}) // MatrixForm
1 2 3
4 0 8
7 8 0
row = {97, 98, 99};
(newa = Insert[a, row, 2]) // MatrixForm
1 2 3
97 98 99
4 0 8
7 8 0
Но для вставки столбца после некоторой борьбы я нашел два способа, которые я показываю ниже, и хотел бы спросите здесь экспертов, видят ли они более короткий и прямой путь (у Mathematica так много команд, и я мог бы пропустить одну, которая делает такие вещи более прямым образом), поскольку я думаю, что методы, которые у меня есть сейчас, все еще слишком сложны для такой базовой операции.
Требуется двойное транспонирование:
a = {{1, 2, 3}, {4, 0, 8}, {7 , 8, 0}}
column = {97, 98, 99}
newa = Transpose[Insert[Transpose[a], column, 2]]
1 97 2 3
4 98 0 8
7 99 8 0
Используйте SparseArray, но нужно следить за местоположениями индексов. Довольно неудобно делать это:
(SparseArray[{{i_, j_} :> column[[i]] /; j == 2, {i_, j_} :> a[[i, j]] /; j == 1,
{i_, j_} :> a[[i, j - 1]] /; j > 1}, {3, 4}]) // Normal
1 97 2 3
4 98 0 8
7 99 8 0
Вопрос в том, есть ли более функциональный способ, который немного короче, чем описанный выше? Я мог бы, конечно, использовать одно из вышеперечисленных и обернуть все это функцией, скажем insertColumn [...]
, чтобы упростить использование. Но хотел посмотреть, есть ли более простой способ сделать это, чем то, что есть у меня.
Для справки, вот как я делаю это в Matlab:
EDU>> A=[1 2 3;4 0 8;7 8 0]
A =
1 2 3
4 0 8
7 8 0
EDU>> column=[97 98 99]';
EDU>> B=[A(:,1) column A(:,2:end)]
B =
1 97 2 3
4 98 0 8
7 99 8 0