运行与Octave并行的循环部分?

问题描述:

我有以下代码,我需要运行超过20000行的矩阵。运行需要几分钟时间,而datenum和str2double函数似乎是瓶颈。由于没有计算依赖于以前的计算,有没有办法将循环分成多个部分并让它们并行执行?任何意见优化此代码将不胜感激。运行与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 

嗯。我更像是一个MATLAB人,而不是Octave,但也许我可以帮忙(如果你仍然在寻找解决方案)

这看起来像我在阅读文件 - 但我需要要做的东西不同于工具提供的问题(否则你可以逃脱dlmread这应该是非常快的)。如果在Octave中没有别的选择会更快,我会尝试使用Java(速度而不是线程);你可以call Java from Octave。 (虽然我还没有在Octave中试过这个,只是MATLAB的等价物)

对str2double的调用看起来非常可疑。您可以向量化,虽然我的一个速度快的测试似乎证实,这是一个缓慢的任务,从内八度至少:

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. 

做最快的事情,如果你的数据是在一个文本文件,使用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]; 

textread格式行告诉它跳过第一列,第二列复制为一个字符串,并解释通过第七列第三的浮点数。这是假设你的数据文件看起来像

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 

此外,str2num约3倍比str2double(我猜是因为它没有做尽可能多的错误检查),如果你需要更多地使用像你原来快技术。