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:
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):
Quindi dipende davvero quello che stai dopo. Ulteriori discussioni si trovano in Loren on the Art of MATLAB blog.