Domanda

Ho il seguente codice che devo eseguire su una matrice con oltre 20000 righe. Sono necessari diversi minuti per l'esecuzione e le funzioni datenum e str2double sembrano essere i colli di bottiglia. Poiché nessun calcolo dipende da quelli precedenti, esiste un modo per interrompere il loop in più parti e farle eseguire in parallelo? Qualche consiglio sull'ottimizzazione di questo codice sarebbe apprezzato.

for i=1:length(DJI)
DJI2(i,1)=datenum(char(DJI(i,2)),'yyyy-mm-dd');
for j=3:7
DJI2(i,j-1)=str2double(char(DJI(i,j)));
end
end
È stato utile?

Soluzione

Hmm. Sono più una persona MATLAB che Octave ma forse posso aiutarti (se stai ancora cercando una soluzione)

Questo sembra il problema che sto leggendo in un file ma ho bisogno di fare qualcosa di diverso dallo strumento (altrimenti potresti cavartela con dlmread che dovrebbe essere piuttosto veloce).

Se non ci fossero alternative in Octave per essere più veloci, proverei a usare Java (per la velocità piuttosto che per il threading); puoi chiamare Java da Octave . (anche se non l'ho provato in Octave, solo l'equivalente MATLAB)

Le chiamate a str2double sembrano terribilmente sospette. Potresti essere in grado di vettorializzarlo, anche se un rapido test di velocità da parte mia sembra confermare che si tratta di un'attività lenta, almeno dall'interno di Ottava:

octave-3.0.3.exe:15> s=sprintf('1 2\n3 4');
octave-3.0.3.exe:16> m=str2double(s)
m =

   1   2
   3   4


octave-3.0.3.exe:35> s=randn(5000,5);
octave-3.0.3.exe:36> z=num2str(s);
octave-3.0.3.exe:37> tic; s2=str2double(z); toc
Elapsed time is 18.9837 seconds.

Altri suggerimenti

La cosa più veloce da fare, se i tuoi dati sono in un file di testo, è usare textread .

function [DJI2] = InterpretFile(datafile)
    [txtdates, c2, c3, c4, c5, c6] = textread(datafile, '%* %s %f %f %f %f %f');
    dates = datenum(strvcat(txtdates),'yyyy-mm-dd');
    DJI2 = [dates c2 c3 c4 c5 c6];

La riga di formato in textread indica di saltare la prima colonna, copiare la seconda colonna come stringa e interpretare le colonne dalla terza alla settima come numeri in virgola mobile. Ciò presuppone che il tuo file di dati assomigli a

skip 1990-01-01 1.234 2.345 3.456 4.012 5.345
skipme2 1990-01-02 1 2 3 4 5
junk 1990-01-03 1.9 2.1 3.2 4.3 5.4

Inoltre, str2num è circa 3 volte più veloce di str2double (suppongo perché non fa lo stesso controllo degli errori), nel caso in cui sia necessario utilizzare qualcosa di più simile a la tua tecnica originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top