2009-08-07 2 views
11

Хорошо, представьте, что у меня есть эта матрица: {{1,2}, {2,3}}, и я предпочел бы {{4,1,2}, {5,2,3}}. То есть, я добавил столбец в матрицу. Есть ли простой способ сделать это?Как добавить столбец к матрице?

Мое лучшее предложение заключается в следующем:

PrependColumn[vector_List, matrix_List] := 
Outer[Prepend[#1, #2] &, matrix, vector, 1] 

Но это запутывает код и постоянно требует загрузки все больше и больше кода. Разве это не так построено?

ответ

11

С ArrayFlatten была введена в Mathematica 6 наименее затемненный решение должно быть

matrix = {{1, 2}, {2, 3}} 
vector = {{4}, {5}} 

[email protected]{{vector, matrix}} 

Хороший трюк заключается в том, что замена любого блока матрицы на 0 дает нулевой блок нужного размера.

7

Я думаю, что не менее неясное является следующим способом сделать это:

PrependColumn[vector_List, matrix_List] := MapThread[Prepend, {matrix, vector}]; 

В общем, MapThread это функция, которую вы будете использовать наиболее часто для выполнения задач, как этот (я использую его все когда вы добавляете метки в массивы, прежде чем их легко создавать с помощью Grid), и это может сделать вещи намного яснее и более краткими, чтобы использовать Prepend вместо эквивалента Prepend[#1, #2]&.

7

Я считаю, что наиболее распространенным способом является транспонирование, начало и конец, транспонировать снова:

PrependColumn[vector_List, matrix_List] := 
    Transpose[Prepend[Transpose[matrix], vector]] 
0

... АБСОЛЮТНО .. ПО FAR ... FASTEST метод добавления или добавления столбца из моих тестов различных методов в массиве RandomReal[100,{10^8,5}] (дети, не пытайтесь это дома ... если ваша машина isn построенный для скорости и памяти, операции на массиве такого размера гарантируют повесить ваш компьютер) ... это: Append[tmp\[Transpose], [email protected]@tmp]\[Transpose]. Замените Append на Prepend по желанию.

Следующее самое быстрое: Table[tmp[[n]]~Join~{n}, {n, [email protected]}] - почти в два раза медленнее.

+4

Очевидно, вы пропустили ответ в http://stackoverflow.com/questions/4270802/inserting-into-a-2d-list/4270825#4270825. Использование 'ArrayFlatten' кажется более быстрым. –

Смежные вопросы