我有以下代码需要在超过 20000 行的矩阵上运行。运行需要几分钟,而 datenum 和 str2double 函数似乎是瓶颈。由于没有计算依赖于以前的计算,有没有办法将循环分成多个部分并让它们并行执行?任何有关优化此代码的建议将不胜感激。
对于 i=1:长度(DJI) DJI2(i,1)=datenum(char(DJI(i,2)),'yyyy-mm-dd'); 对于 j=3:7 DJI2(i,j-1)=str2double(char(DJI(i,j))); 结尾 结尾
我有以下代码需要在超过 20000 行的矩阵上运行。运行需要几分钟,而 datenum 和 str2double 函数似乎是瓶颈。由于没有计算依赖于以前的计算,有没有办法将循环分成多个部分并让它们并行执行?任何有关优化此代码的建议将不胜感激。
对于 i=1:长度(DJI) DJI2(i,1)=datenum(char(DJI(i,2)),'yyyy-mm-dd'); 对于 j=3:7 DJI2(i,j-1)=str2double(char(DJI(i,j))); 结尾 结尾
唔。我比 Octave 更喜欢 MATLAB,但也许我可以提供帮助(如果您仍在寻找解决方案)
这看起来像我正在阅读文件但我需要做一些与工具不同的事情提供问题(否则你可以逃脱应该很漂亮的 dlmread快速地)。
如果在 Octave 中没有更快的替代方案,我会尝试使用 Java(为了速度而不是线程);您可以从 Octave 调用 Java。(虽然我没有在 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.
如果您的数据在文本文件中,最快的方法是使用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 到第 7 列解释为浮点数。这假设您的数据文件看起来像
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
Also, str2num
is about 3x faster than str2double
(I guess because it doesn't do as much error checking), in case you need to use something more like your original technique.