1

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)));
終わり
終わり
4

2 に答える 2

1

うーん。私は Octave よりも MATLAB の方が好きですが、お役に立てるかもしれません (まだ解決策を探している場合)。

これは、I'm-reading-in-a-file-but-I-need-to-do-something-different-than-the-tool-provides 問題のように見えます (そうでなければ、きれいなはずの 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.
于 2009-01-23T00:28:02.960 に答える
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、最初の列をスキップし、2番目の列を文字列としてコピーし、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

また、元の手法に似たものを使用する必要がある場合に備えて、(エラーチェックがそれほど行われないためstr2num)約3倍高速です。str2double

于 2010-03-11T07:54:58.230 に答える