2013-05-25 70 views
5

Qual è il modo più efficiente per ripetere un vettore?Il modo più efficiente per ripetere un vettore in Matlab

Attualmente ho l'impressione che repmat sia superiore a qualsiasi altro metodo? O sono terribilmente in errore con questa mentalità?

Sarebbe possibile produrre esattamente lo stesso risultato di repmat utilizzando una tecnica diversa? Forse una moltiplicazione di matrice ordinaria?

Vorrei esprimere la mia più grande gratitudine per tutto il vostro interesse e risposte di supporto!

AER

risposta

6

La linea di fondo, bsxfun è più veloce di due avete chiesto se il vettore inizio è lungo o il # di ripetizioni è abbastanza grande (vedi sotto), altrimenti la moltiplicazione di matrici è più efficiente. Tra i due che hai chiesto sembra una moltiplicazione di matrice + la risagoma vince in efficienza di un fattore di ~ 3 su repmat. Ho usato timeit seguente modo, ho creato un vettore casuale di elementi 1E5 e controllò quanto tempo ci vuole per creare 100 ripetizioni di esso:

v=rand(1e5,1); 
[email protected]()repmat(v,[100,1]) 
[email protected]() reshape(v*ones(1,100),[],1); 

timeit(f1) 
ans = 
    0.1675 

timeit(f2) 
ans = 
    0.0516 

però bsxfun è ancora più veloce:

[email protected]() reshape(bsxfun(@times,v,ones(1,100)),[],1) 

timeit(f3) 

ans = 
    0.0374 

Ecco un più attento studio di questa osservazione:

Dato un vettore è lungo 1000 elementi, ripetendola 10 a volte 1E5 generare i seguenti tempi di esecuzione:

enter image description here

Per i più piccoli # di ripetizioni v'è poca differenza tra bsxfun e la moltiplicazione di matrici, ma come il # di ripetizioni passa ~ 1e3, bsxfun vince chiaramente.

Tuttavia, l'utilizzo di un vettore lungo solo 10 elementi con lo stesso intervallo di ripetizioni mostra che la moltiplicazione della matrice è più efficiente. bsxfun comincia ad essere meglio solo dopo 10^5 si ripete, ma anche in questo caso è solo ~ 5% più veloce (non mostrato):

enter image description here

Quindi dipende davvero quello che stai dopo. Ulteriori discussioni si trovano in Loren on the Art of MATLAB blog.

0

No, attualmente repmat mostly is slow er di indicizzazione semplice, che funziona come segue:

Classis repmat:

a = [ 1 2 3 ]; 
repmat(a,4,1) 
>> 
    [1 2 3; 
     1 2 3; 
     1 2 3; 
     1 2 3]; 

versione indicizzazione di questo:

a(ones(4,1),:); 

che dà lo stesso risultato .

0

dipende davvero da che tipo di verctor si desidera. per esempio se si desidera un un vettore specializzato come fila di quelli, poi

tic 
repmat([1],3,5) 
toc 

tic 
ones(3,5) 
toc 

vi dirà che utilizzano "uno" è di circa 3 volte più veloce (almeno sulla mia macchina). Puoi sempre usare tic e toc per misurare quale metodo è più veloce. proviamo un altro ...

tic 
repmat([1,2,3],1,2) 
toc 

tic 
cat(2,[1,2,3],[1,2,3]) 
toc 

ora gatto è 3 volte più veloce di nuovo, ma ha il suo limite evidente. Spero che questo aiuti

Problemi correlati