3

3,400 万を超える粒子の一連の x、y、z 座標であるこのファイルがあり、次のように読み込んでいます。

parfor i = 1:Ntot
 x0(i,1)=fread(fid, 1, 'real*8')';
 y0(i,1)=fread(fid, 1, 'real*8')';
 z0(i,1)=fread(fid, 1, 'real*8')';
end

ループを実行せずにこれを読み取る方法はありますか? 読み込みが大幅に高速化されます。x、y、z の 3 つのベクトルが必要です。読み取りプロセスを高速化したいだけです。ありがとう。他の提案を歓迎します。

4

3 に答える 3

3

私はMatlabを搭載したマシンを持っておらず、テストするファイルも持っていませんが、coordinates = fread (fid, [3, Ntot], 'real*8')うまくいくはずです。

于 2012-12-09T06:15:50.373 に答える
0

あなたが正しい。より大きなバッチでデータを読み取ることは、通常、ファイルの読み取りを高速化するための重要な部分です。別の部分は、呼び出しなど、宛先変数のゼロを事前に割り当てていzerosます。

私はこのようなことをします:

%Pre-allocate
x0 = zeros(Ntot,1);
y0 = zeros(Ntot,1);
z0 = zeros(Ntot,1);

%Define a desired batch size.  make this as large as you can, given available memory.
batchSize = 10000;

%Use while to step through file    
indexCurrent = 1;           %indexCurrent is the next element which will be read
while indexCurrent <= Ntot

    %At the end of the file, we may need to read less than batchSize
    currentBatch = min(batchSize,  Ntot-indexCurrent+1);

    %Load a batch of data
    tmpLoaded = fread(fid, currentBatch*3, 'read*8')';

    %Deal the fread data into the desired three variables
    x0(indexCurrent + (0:(currentBatch-1))) = tmpLoaded(1:3:end);
    y0(indexCurrent + (0:(currentBatch-1))) = tmpLoaded(2:3:end);
    z0(indexCurrent + (0:(currentBatch-1))) = tmpLoaded(3:3:end);

    %Update index variable
    indexCurrent = indexCurrent + batchSize;
end

もちろん、私はテストしていないので、必ずテストしてください。私はいつも、この種の作業でオフバイワンエラーが発生するのではないかと疑っています。

于 2012-12-09T06:15:30.310 に答える
0

多分freadはあなたが探している関数です。

于 2012-12-09T06:02:29.137 に答える