2011-11-30 14 views
6

Sto cercando qualcosa come le list comprehensions in MATLAB ma non ho trovato nulla di simile nel documentario.matlab C'è qualcosa come la comprensione delle liste come in Python?

in Python che sarebbe qualcosa di simile

A=[i/50 for i in range(50)] 
+2

È possibile trovare utili http://www.scipy.org/NumPy_for_Matlab_Users. Notare che in Numpy, probabilmente fare 'A = np.arange (50)/50.0' invece di una lista di comprensione per la velocità. – mtrw

+0

@mtrw Great link.Thanks –

risposta

10

Matlab è molto affezionato a 'vettorializzazione' . Scriveresti il ​​tuo esempio come:

A = (0:49) ./ 50 

Matlab odia i loop e quindi la comprensione delle liste. Detto questo, dai un'occhiata alla funzione arrayfun.

+2

MATLAB * odia * loops? Non pensarlo. Ti fornisce solo altri modi di fare le cose. Come risultato, * alla fine finirai per odiarli. – ktdrv

+1

Finisco per odiare scrivere loop in MATLAB, non loop in generale. Io e il mio MATLAB abbiamo passato molto tempo ... se il software potesse avere qualche empatia, ora odierà anche i loop. –

+0

Potrebbe essere utile sottolineare che questa è un'area in cui Matlab e Python sono simili. Python è anche lento al looping (se confrontato con linguaggi compilati come C), e dovresti provare a vectorize ovunque sia possibile in python se il tempo di calcolo è importante, tipicamente usando numpy. – Caleb

2

No, Matlab non ha list comprehension. Davvero non ne hai bisogno, come ci si dovrebbe concentrare su calcoli a livello di array:

A = (1:50)/50 
-1

Matlab può lavorare con array direttamente, rendendo di lista meno utili

0

Se state cercando di fare è così banale come il campione, si potrebbe semplicemente fare una divisione scalare:

A = (0:50) ./ 50 
5

si può fare:

(1:50)/50 

O per qualcosa di più generale , si può fare:

[email protected](x) (x/50); 
arrayfun(f,1:50) 
0

ci sono diversi modi per generare un elenco in Matlab che va da 0 a 49/50 in incre menti di 1/50

A = (0:49)/50 

B = 0:1/50:49/50 

C = linspace(0,49/50,50) 

EDIT Come Sam Roberts sottolineato nei commenti, anche se tutte queste liste dovrebbero essere equivalenti, i risultati numerici sono differenti a causa di errori a virgola mobile. Ad esempio:

max(abs(A-B)) 
ans = 
    1.1102e-16 
+1

Nessuno di questi valori di A è uguale! Prova a chiamarli A, B e C e confrontandoli con tutti (A == B) ecc. Un esercizio interessante nel diverso comportamento di due punti, due punti e linspace. Conosco zero su Python, ma se qualcuno su questo thread fosse in grado di confrontare queste tre opzioni di MATLAB con la comprensione degli elenchi Python potrebbe essere utile. EDIT: rimosso il mio -1, non volevo sembrare critico, è stata una buona risposta. –

+0

@SamRoberts: questo è un ottimo punto. Anche se teoricamente, tutte le soluzioni dovrebbero essere equivalenti, i loro risultati non sono identici a causa di errori in virgola mobile. – Jonas

+0

Proprio perché le persone capiscano il mio commento precedente - @Jonas in origine chiamava tutte le sue variabili A, B e C solo A.Dopo la sua modifica, la sua risposta è ora più chiara, ma il mio commento ha meno senso ... –

Problemi correlati