Я думаю, что 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