Как добавить столбец к матрице?
Хорошо, представьте, что у меня есть эта Матрица: {{1,2}, {2,3}}, и я предпочел бы {{4,1,2}, {5,2,3}}. То есть, я добавил столбец в матрицу. Есть ли простой способ сделать это?
Мое лучшее предложение:
PrependColumn[vector_List, matrix_List] :=
Outer[Prepend[#1, #2] &, matrix, vector, 1]
Но он запутывает код и постоянно требует загрузки большего количества кода. Разве это не так построено?
Ответы
Ответ 1
Поскольку ArrayFlatten
был введен в Mathematica 6, наименее запутанное решение должно быть
matrix = {{1, 2}, {2, 3}}
vector = {{4}, {5}}
[email protected]{{vector, matrix}}
Хороший трюк заключается в том, что замена любого блока матрицы на 0
дает нулевой блок нужного размера.
Ответ 2
Я думаю, что наименее неясным является следующий способ сделать это:
PrependColumn[vector_List, matrix_List] := MapThread[Prepend, {matrix, vector}];
В общем, MapThread
- это функция, которую вы чаще всего будете использовать для таких задач, как эта (я все время использую ее при добавлении меток в массивы, прежде чем создавать их с помощью Grid
), и это может сделать вещи намного понятнее и проще использовать Prepend
вместо эквивалентного Prepend[#1, #2]&
.
Ответ 3
Я считаю, что наиболее распространенным способом является транспонирование, добавление и перенос:
PrependColumn[vector_List, matrix_List] :=
Transpose[Prepend[Transpose[matrix], vector]]
Ответ 4
АБСОЛЮТНО.. ПО FAR... FASTEST метод добавить или добавить столбец из моих тестов различных методов в массиве RandomReal[100,{10^8,5}]
(дети, не пробуйте это дома... если ваша машина не построен для скорости и памяти, операции на массиве такого размера гарантированно повесить ваш компьютер)
... это: Append[tmp\[Transpose], [email protected]@tmp]\[Transpose]
.
Замените Append
на Prepend
по желанию.
Следующее самое быстрое: Table[tmp[[n]]~Join~{n}, {n, [email protected]}]
- почти в два раза медленнее.