5

MATLAB で 2 つの異なる方法でいくつかのコードを記述しました。最初に、一見ばかげているように見える 2 つの for ループを使用しました。

Initial = [zeros(10,1) ones(10,1)];

for xpop=1:10
    for nvar=1:10
        Parent(xpop,nvar) = Initial(nvar,1)+(Initial(nvar,2)-Initial(nvar,1))*rand();
    end
end

2 番目のスキームでは、ベクトル化された計算を実行しようとしました (より高速になる可能性があると想定しました)。

Parent = repmat(Initial(:,1),1,10) + rand(10,10).*(repmat(Initial(:,2),1,10)-repmat(Initial(:,1),1,10));

コードの 3 つの異なる実行での経過時間は、次のように表示されます。

Elapsed time is 0.000456 seconds.
Elapsed time is 0.006342 seconds.

Elapsed time is 0.000457 seconds.
Elapsed time is 0.006147 seconds.

Elapsed time is 0.000471 seconds.
Elapsed time is 0.006433 seconds.

最初のスキームが 2 番目のスキームよりも速いのはなぜですか? 「.*」コマンド内で本当に 2 つの愚かな for ループを実行していますか?

4

2 に答える 2

9

テスト セットアップが小さすぎて、ベクトル化の利点を示すことができません。

Initial = [zeros(10,1) ones(10,1)];
Elapsed time is 0.000078 seconds.
Elapsed time is 0.000995 seconds.

より大きな問題については、次のとおりです。

Initial = [zeros(1000,1) ones(1000,1)];
Elapsed time is 2.797949 seconds.
Elapsed time is 0.049859 seconds.
于 2013-07-10T14:02:30.133 に答える