2009-08-07 25 views
11

Ok, immagino di avere questa matrice: {{1,2}, {2,3}}, e preferirei avere {{4,1,2}, {5,2,3}}. Cioè, ho anteposto una colonna alla matrice. C'è un modo semplice per farlo?Come anteporre una colonna a una matrice?

Il mio miglior proposta è questa:

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

Ma offusca il codice e costantemente richiede il caricamento di più e più codice. Non è costruito in qualche modo?

risposta

11

Dal ArrayFlatten è stato introdotto nel Mathematica 6 la soluzione meno offuscato deve essere

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

[email protected]{{vector, matrix}} 

Un bel trucco è che la sostituzione di qualsiasi blocco matriciale con 0 ti dà un blocco zero della giusta dimensione.

7

penso il meno oscura è il seguente modo di fare questo è:

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

In generale, MapThread è la funzione che userete più spesso per compiti come questo (lo uso per tutto il tempo in cui aggiungere etichette alle matrici prima di formularle bene con Grid) e può rendere le cose molto più chiare e concise da usare Prepend invece che dall'equivalente Prepend[#1, #2]&.

7

Credo che il modo più comune è quello di trasporre, anteporre, e trasporre ancora:

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

IL ... ASSOLUTAMENTE .. DI FAR ... IL MODO PIÙ VELOCE per aggiungere o anteporre una colonna ai miei test di vari metodi sull'array RandomReal[100,{10^8,5}] (bambini, non provatelo a casa ... se la vostra macchina non è 't costruito per la velocità e la memoria, le operazioni su un array di queste dimensioni sono garantite per appendere il computer) ... è questo: Append[tmp\[Transpose], [email protected]@tmp]\[Transpose]. Sostituire con Prepend a piacere.

La prossima cosa più veloce è questo: Table[tmp[[n]]~Join~{n}, {n, [email protected]}] - quasi due volte più lento.

+4

A quanto pare vi siete persi la risposta in http://stackoverflow.com/questions/4270802/inserting-into-a-2d-list/4270825#4270825. Usare 'ArrayFlatten' sembra essere più veloce. –

Problemi correlati