4

すでに完全な行列を完全な行列に変換するのが遅いことに気付きました:

>> tic; for k = 1:100; x = uint16(ones(10000,100)); end; toc
Elapsed time is 0.035748 seconds.
>> tic; for k = 1:100; x = uint16(uint16(ones(10000,100))); end; toc
Elapsed time is 0.034180 seconds.
>> tic; for k = 1:100; x = full(uint16(ones(10000,100))); end; toc
Elapsed time is 0.460977 seconds. %%%%% SLOW!

私もなしでテストしuint16ました:

>> tic; for k = 1:100; x = ones(10000,100); end; toc
Elapsed time is 0.060028 seconds.
>> tic; for k = 1:100; x = full(ones(10000,100)); end; toc
Elapsed time is 0.229058 seconds. %%%%% SLOW!

同じ効果。

どうしてこれなの?full疎行列を完全行列にのみ変換することになっています。すでに満杯の場合は、何もしないでください。

編集:issparse超高速です!私はMEXだと思いますが、それは主にメモリコストですか?

Mac OS X 上の MATLAB バージョン 7.13.0.564 (R2011b)

4

2 に答える 2

1

fullうまく動作します。

遅い部分は実際にはones(10000, 100)...ここに証拠があります:

>> tic, for k = 1:100, x = ones(10000,100); end, toc
Elapsed time is 0.043143 seconds.

>> A = ones(10000,100);
>> tic, for k = 1:100, x = full(A); end, toc
Elapsed time is 0.000081 seconds.

full非スパース行列で呼び出され、高速で実行されるため、速度が低下する理由にはなりません。

于 2013-02-26T16:12:34.107 に答える
1

免責事項:これは何が起こっているのかについての私の最善の推測ですが、Matlab のフードの下で何が起こっているのかはわかりません。更新:コメントで、EitanTは、私の推測は間違っている可能性が高いと指摘しました。

Matlab のJIT エンジンは、これらのケースのいくつかで最適化を行っていると思いますが、すべてではありません。

変数が作成されても使用されないループがある場合、JIT エンジンはその変数を何度も作成する必要はありません。それは一度だけです。このようなものはすべて高速になります。

% this calls 'ones' once
for i = 1:100, x = ones(10000,100); end

しかし、変数を作成してそれを関数に渡すなどして使用すると、その変数は毎回作成されます。これには明らかに時間がかかります。

% this calls 'ones' every iteration to pass to `full`
for i = 1:100, x = full(ones(10000,100)); end
于 2013-02-26T16:30:03.953 に答える