我需要在包含超过20000行的矩阵上运行以下代码。运行需要几分钟,而datenum和str2double函数似乎是瓶颈。由于没有计算依赖于以前的计算,有没有办法将循环分成多个部分并让它们并行执行?任何有关优化此代码的建议都将受到赞赏。
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
答案 0 :(得分:1)
嗯。我不仅仅是Octave的MATLAB人员,但也许我可以提供帮助(如果您仍在寻找解决方案)
这看起来就像我在阅读文件 - 但是我需要做的事情 - 不同于工具提供的问题(否则你可以逃脱dlmread应该很快)。
如果Octave中没有替代方案可以更快,我会尝试使用Java(速度而不是线程);你可以call Java from Octave。 (虽然我没有在Octave中尝试过这个,只是MATLAB等价物)
对str2double的调用看起来非常可疑。你可能能够对其进行矢量化,虽然我的快速速度测试似乎证实这是一个缓慢的任务,至少从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.
答案 1 :(得分:0)
如果您的数据位于文本文件中,最快的方法是使用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
中的格式行告诉它跳过第一列,将第二列复制为字符串,并将第3列解释为浮点数。这假设您的数据文件类似于
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
比str2double
快约3倍(我猜是因为它没有做那么多的错误检查),以防你需要使用更像原始技术的东西。