2

MATLAB では、z任意のサイズの配列を入力として取ります。私は今w、同じ次元の配列を作成したいと考えていますzが、その値はどこkにでもある実数です。私が考えた方法は以下の2つです。

z = rand(1000,1000); % pretend the size of z is not known beforehand
k = 2.3;

w = ones(size(z))*k;
w = zeros(size(z)) + k;
w = z - z + k;

これらの方法のどれが最速かを確認しようとしましたが、その結果には非常に驚きました。

tic; for n = 1:1000, w = ones(size(z))*k; end; toc
tic; for n = 1:1000, w = zeros(size(z)) + k; end; toc
tic; for n = 1:1000, w = z - z + k; end; toc

Elapsed time is 7.243662 seconds.
Elapsed time is 4.770328 seconds.
Elapsed time is 2.750093 seconds.

さらに驚くべきことは、 for k = 1ones()最速だと思われる場所)

tic; for n = 1:1000, w = ones(size(z)); end; toc
tic; for n = 1:1000, w = z - z + 1; end; toc

Elapsed time is 4.856666 seconds.
Elapsed time is 2.759324 seconds.

私の質問は、ここでの私の結果は正しいですか? もしそうなら、w = z - z + kの配列を初期化する最速の方法kはありますか、それとももっと良い方法がありますか?

4

3 に答える 3

1

よく見ると、配列を初期化するためのあいまいな方法がたくさんあることがわかります。

たとえば、本当に予想外の質問については、この質問を参照してください。

速度のためにそれらのいずれかを選択する場合は、z1000x1000 だけでなく、さまざまなサイズのタイミングを比較する必要があります。それらはすべてまったく異なる方法でスケーリングされるためです (MATLAB が突然別のメモリ割り当てに切り替わるため、おそらく単調ではない可能性があります)。配列がしきい値サイズに達したときのメソッド)。3 つの方法を試してみましたが、小さいサイズでは、最初の方法が 2 番目の方法よりもはるかに高速であることがわかりました。

@horchler が言及しているように、タイミングは MATLAB のバージョン、OS、プロセッサのキャッシュ サイズなどにも依存します。

于 2013-07-10T16:39:23.163 に答える
0

おそらく、より速い方法はまだあります

w = zeros(size(z,1),size(z,2)) + k;

tic; for n = 1:1000, w = zeros(size(z,1),size(z,2)) + k; end; toc
Elapsed time is 2.120249 seconds.

理由については私を打ち負かしますが。

于 2013-07-10T15:28:33.403 に答える