2

乗算したいA(21,000 x 80,000)とB(3,000 x 80,000)の2つのファイルに2つの大きな行列があります。

C = A * B_transposed

現在、次のスクリプトがあります。

A = dlmread('fileA')
B = dlmread('fileB')
C = A*(B')
dlmwrite('result', C)
exit

ただし、行列(最初の2行)の読み取りには非常に時間がかかり、Matlab(各dlmreadの後)はこれらの行列の印刷に進みます。この印刷を無効にしてプロセスを高速化する方法を知っていますか?

4

1 に答える 1

7

印刷を抑制するには、各行の後にセミコロンを付けるだけです。

A = dlmread('fileA');
B = dlmread('fileB');
dlmwrite('result', A * B');

読み取りを高速化する1つの方法は、使用している区切り文字をMatlabに通知することです。これにより、区切り文字を推測する必要がなくなります。たとえば、ファイルがタブ区切りの場合は、次のように使用できます。

A = dlmread('fileA','\t');

または、カンマ区切りの場合は、次を使用できます。

A = dlmread('fileA',',');

それ以外に、別のファイル形式の使用を検討することもできます。ファイルはどこで生成されますか?それらが別のMatlabプロセスによって生成された場合は、Matlabのバイナリ形式で保存できます。これには、およびを使用してアクセスしloadますsave

A = [1 2; 3 4];
save('file.mat','A');
clear A;
load('file.mat','A');

簡単なベンチマークとして、次のマトリックスを2つのファイルに書き込みました。

>> A = [1 2 3; 4 5 6; 7 8 9];
>> dlmwrite('test.txt',A);
>> save('test.mat','A');

次に、2つのベンチマークを実行しました。

>> tic; for i=1:1000; dlmread('test.txt',','); end; toc
Elapsed time is 0.506136 seconds.
>> tic; for i=1:1000; load('test.mat','A'); end; toc
Elapsed time is 0.260381 seconds.

ここで使用しているバージョンloadは、バージョンの半分の時間で入ってきましたdlmread。適切なサイズの行列に対して独自のベンチマークを実行し、自分に最適なものを確認できます。

于 2013-01-15T09:52:24.697 に答える