运行与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
(我猜是因为它没有做尽可能多的错误检查),如果你需要更多地使用像你原来快技术。