2010-06-25 1 views
35

So che length(x) restituisce max(size(x)) e restituisce il numero totale di elementi di x, ma quale è meglio per un 1 per n array? Ha importanza o sono intercambiabili in questo caso?Differenza tra le funzioni di Numel e lunghezza di MATLAB

EDIT: Solo per i calci:

alt text

sembra che siano le stesse prestazioni-saggio fino ad arrivare a 100k elementi.

risposta

17

In tal caso ritornano stesso e non c'è differenza. In termini di prestazioni, dipende dal funzionamento interno degli array in MATLAB. Per esempio. se ci sono metainformazioni sul numero di elementi presenti nell'array (indipendentemente dalla forma), quindi numel è il più veloce possibile, mentre max (size (x)) sembra aver bisogno di più lavoro per ottenere la stessa cosa (recuperare le dimensioni e quindi trovando il massimo tra quelli). In questo caso sono abituato a usare numel, ma a parte il discorso delle prestazioni (ipotetico), direi che sono intercambiabili.

+3

Hai ragione sulla parte performance. Ho appena eseguito 100 iterazioni di numel contro lunghezza su x = 1: 100000000 e numel era in media 3,0919 volte più veloce. Non dovrebbe importare molto per gli array più piccoli. – Doresoom

+0

... e ora sono davvero curioso delle prestazioni di numel/lunghezza rispetto alle dimensioni dell'array. – Doresoom

+7

LENGTH non sarà mai il collo di bottiglia delle prestazioni nel tuo programma! Solo i reali miglioramenti delle prestazioni contano. Per tutti gli altri casi, la leggibilità del codice è importante. – Mikhail

16

Per un array 1 per N, sono essenzialmente uguali. Per una matrice multidimensionale M, possono dare risultati diversi:

  • numel(M) è equivalente a prod(size(M)).
  • length(M) equivale a max(size(M)). Se M è vuota (cioè qualsiasi dimensione è 0), allora length(M) è 0.
+4

Si noti che se x = ones (0, n); then max (size (x)) -> n while length (x) -> 0 –

6

Come detto altri sono uguali per un array monodimensionale.

L'IMHO dal punto di vista della leggibilità del codice length deve essere utilizzato su matrici unidimensionali. Si tratta di "intentional programming", si vede il codice e si capisce cosa aveva in mente il programmatore quando concepiva il suo lavoro. Quindi quando vedo numel so che è usato su una matrice.

length vs. numel era un argomento di discussione nel nostro team per un certo numero di anni. Ex sviluppatore senior non si è preoccupato della funzionalità del codice, solo del lavoro svolto e utilizzato solo numel in un codice altrimenti non ben leggibile/formattato. L'altro ragazzo è un matematico e utilizzava length solo su array numerici che erano per lui "veri" array. Per gli array di celle e gli array di strutture ha utilizzato numel.

+2

Buona prospettiva - aumento della leggibilità su un minuto/aumento insignificante delle prestazioni.+1 – Doresoom

+7

Quando vedo NUMEL usato, non presumo che sia usato su una matrice rispetto a un vettore, presumo semplicemente che sia usato su un oggetto per il quale le dimensioni non sono importanti e solo il * numero * di elementi questioni. – gnovice

+0

È importante quando si procede al refactoring del codice e non si sa a priori se si tratta di un vettore o di una matrice! – Mikhail