2009-08-07 34 views
11

Ok, wyobraź sobie, że mam tę Matrix: {{1,2}, {2,3}}, a wolę mieć {{4,1,2}, {5,2,3}}. To znaczy, dodałem kolumnę do macierzy. Czy istnieje prosty sposób na zrobienie tego?Jak dodać kolumnę do macierzy?

Moja najlepsza propozycja jest taka:

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

Ale zaciemnia kod i ciągle wymaga ładowania coraz więcej kodu. Czy to nie jest w jakiś sposób zbudowane?

Odpowiedz

11

Od ArrayFlatten został wprowadzony w Mathematica 6 najmniej ukrywane rozwiązanie musi być

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

[email protected]{{vector, matrix}} 

Miła trik jest to, że zastąpienie dowolnego bloku macierzy wartością 0 daje zerowy blok o odpowiednim rozmiarze.

7

myślę, że co najmniej niejasne jest następujący sposób robi to:

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

Ogólnie MapThread jest funkcją, która będzie najczęściej używane do zadań takich jak ten (używam go cały czas dodawania etykiet do tablic przed ich ładnym uformowaniem za pomocą Grid) i może sprawić, że rzeczy będą bardziej przejrzyste i zwięzłe w użyciu Prepend zamiast równoważnego Prepend[#1, #2]&.

7

wierzę, najczęstszym sposobem jest transpozycja, prepend i transpozycji ponownie:

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

THE ... ABSOLUTNIE .. ZA DALEJ ... NAJSZYBSZA metoda dodawania lub dodawania kolumn z moich testów różnych metod na tablicy RandomReal[100,{10^8,5}] (dzieci, nie próbuj tego w domu ... jeśli twoja maszyna nie jest zbudowane dla szybkości i pamięci, operacje na macierzy tego rozmiaru gwarantują, że powiesisz komputer) ... jest to: Append[tmp\[Transpose], [email protected]@tmp]\[Transpose]. Wymień Append z Prepend do woli.

Następna najszybsza rzecz jest następująca: Table[tmp[[n]]~Join~{n}, {n, [email protected]}] - prawie dwa razy wolniej.

+4

Najwyraźniej przegapiłeś odpowiedź na http://stackoverflow.com/questions/4270802/inserting-into-a-2d-list/4270825#4270825. Używanie 'ArrayFlatten' wydaje się szybsze. –

Powiązane problemy