2011-12-31 17 views

risposta

14

So che è tardi nel gioco, ma per quello che vale, c'è un modo più semplice.

my_matrix : matrix ([a, b, c], [d, e, f]); 
my_list : args (my_matrix); 
=> [[a, b, c], [d, e, f]] 
+0

Grazie. Sembra funzionare :-). –

+1

@Grzegorz Puoi spostare il segno di spunta nella risposta di Robert, poiché sembra essere il modo più ragionevole di fare le cose. – Simon

+1

@Simon Fair point - Lo ha fatto. Tuttavia, non riesco a ricordare perché, perché stavo scrivendo la sceneggiatura Maxima più lunga, nel mio caso la tua soluzione funzionava meglio o era più conveniente. Comunque, spuntare il segno di spunta Grazie a tutti e due per l'aiuto, grazie! –

6

Sono lontano da un esperto Maxima, ma dal you asked me to look at this question, ecco cosa ho dopo una rapida occhiata allo documentation.

Innanzitutto, l'documentation on matrices ha fornito solo un modo per trasformare le matrici in elenchi, ovvero list_matrix_entries. Tuttavia, questo restituisce un elenco semplice delle voci. Per ottenere una struttura lista annidata, qualcosa come le seguenti opere

DataL : [[1, 2], [2, 4], [3, 6], [4, 8]]; /* Using your example list */ 
DataM : apply('matrix, DataL);    /* and matrix    */ 

DataML : makelist(list_matrix_entries(row(DataM, i)), i, 1, 4); 
is(DataML = DataL); /* true */ 

Questo è goffo e probabilmente inefficiente. Utilizzando la struttura sottostante Lisp a Maxima (e analogia con Mathematica, che sono più familiarità con) è possibile esaminare le teste di DataL e DataM utilizzando part:

part(DataL, 0); /* [  */ 
part(DataM, 0); /* matrix */ 

Poi per la conversione tra le due strutture, si può utilizzare substpart

is(substpart(matrix, DataL, 0) = DataM); /* true */ 
is(substpart("[", DataM, 0) = DataL); /* true */ 

utilizzando substpart a livello 0 è quasi la stessa cosa che usare apply, tranne che funziona su più di un semplice elenca.

+0

Grazie @Simon. La tua soluzione funziona alla grande. Ho camminato avanti e indietro la documentazione senza successo. Poiché utilizzo il metodo dei minimi quadrati e pochi altri che operano su tipi diversi (alcuni restringono a matrice, mentre altri operano su elenchi) la conversione in due modi è di grande aiuto. –