2008-12-08 7 views
1

J'ai le code suivant que j'ai besoin de courir sur une matrice avec plus de 20000 lignes. Il faut plusieurs minutes pour s'exécuter et les fonctions datenum et str2double semblent être les goulots d'étranglement. Puisqu'aucun calcul ne dépend des précédents, existe-t-il un moyen de casser la boucle en plusieurs parties et de les faire exécuter en parallèle? Tout conseil sur l'optimisation de ce code serait apprécié.Exécution de portions d'une boucle en parallèle avec Octave?

 
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 

Répondre

1

Hmm. Je suis plus une personne MATLAB qu'Octave mais peut-être je peux vous aider (si vous êtes toujours à la recherche d'une solution)

Cela ressemble à l'Im-lire-dans-un-fichier-mais-je-besoin -to-do-something-different-than-the-tool-provides (sinon vous pourriez vous en sortir avec dlmread qui devrait être plutôt rapide).

S'il n'y avait pas d'alternative dans Octave pour être plus rapide, j'essaierais d'utiliser Java (pour la vitesse plutôt que pour le thread); vous pouvez call Java from Octave. (bien que je n'ai pas essayé cela dans Octave, juste l'équivalent MATLAB)

Les appels à str2double ont l'air terriblement suspicieux. Vous pourrez peut-être vectoriser que, même si un test de vitesse rapide de ma part semble confirmer que c'est une lente tâche, au moins à l'intérieur Octave:

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. 
0

la plus rapide chose à faire, si vos données sont en un fichier texte, utilisez 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 ligne de format textread dit à sauter la première colonne, copiez la deuxième colonne sous forme de chaîne, et d'interpréter la 3ème à travers des colonnes 7e sous forme de nombres à virgule flottante. Cela suppose que votre fichier de données ressemble

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 

En outre, str2num est environ 3 fois plus rapide que str2double (je suppose parce qu'il ne fait pas autant de contrôle d'erreur), si vous avez besoin d'utiliser quelque chose comme original technique.