Questo è un metodo più veloce di repmat
o reshape
da un ordine di grandezza
Uno dei migliori metodi per fare queste cose sta usando Tony's Trick. Repmat e Reshape si trovano di solito ad essere più lento di trick di Tony come utilizza direttamente l'indicizzazione intrinseca di Matlabs. Per rispondere si mette in discussione,
Diciamo che, vuoi per affiancare l'vettore riga r=[1 2 3]
N
momenti come r=[1 2 3 1 2 3 1 2 3...]
, quindi,
c=r'
cc=c(:,ones(N,1));
r_tiled = cc(:)';
Questo metodo ha un notevole risparmio di tempo contro reshape
o repmat
per grandi N
's.
EDIT: Rispondi a @ dubbi di Li-Aung Yip
ho condotto un piccolo test Matlab per verificare la differenza di velocità tra repmat
e tony's trick
. Usando il codice menzionato di seguito, ho calcolato i tempi per la costruzione dello stesso vettore piastrellato da un vettore di base A=[1:N]
. I risultati mostrano che YES, Tony's-Trick è PIÙ VELOCE DI UN ORDINE di MAGNITUDINE, specialmente per i più grandi N. Le persone sono benvenute a provarle da sole. Questo differenziale molto tempo può essere critico se tale operazione deve essere eseguita in loop. Ecco la piccola sceneggiatura che ho usato;
N= 10 ;% ASLO Try for values N= 10, 100, 1000, 10000
% time for tony_trick
tic;
A=(1:N)';
B=A(:,ones(N,1));
C=B(:)';
t_tony=toc;
clearvars -except t_tony N
% time for repmat
tic;
A=(1:N);
B=repmat(A,1,N);
t_repmat=toc;
clearvars -except t_tony t_repmat N
I tempi (in secondi) per entrambi i metodi sono indicati di seguito;
- N = 10, time_repmat = 8e-5, time_tony = 3e-5
- N = 100, time_repmat = 2.9E-4, time_tony = 6e-5
- N = 1000, time_repmat = 0,0302 , time_tony = 0,0058
- N = 10000, time_repmat = 2,9199, time_tony = 0,5292
mio RAM non mi ha permesso di andare oltre N = 10000. Sono sicuro che la differenza di tempo tra i due metodi sarà ancora più significativa per N = 100000. Lo so, questi tempi potrebbero essere diversi per macchine diverse, ma la differenza relativa in ordine di grandezza dei tempi sarà valida.Inoltre, lo so, la media dei tempi avrebbe potuto essere una metrica migliore, ma volevo solo mostrare l'ordine di grandezza della differenza nel consumo di tempo tra i due approcci. I miei contatti macchina/OS sono i seguenti:
Rilevante macchina/OS/Matlab Dettagli: Athlon i686 Arch, Ubuntu 11.04 a 32 bit, 3GB di RAM, Matlab 2011b
Perfetto. Grazie. – CaptainProg