0

約3か月前、Matlabでサンプルを実行していましたが、何か奇妙なことが起こりました。今日、私が他の質問(セルの要素を並べ替えるにはどうすればよいですか?)に対する答えをテストしているときに、再び起こりました。Matlabでの事前割り当てについてです。説明させてください:

ones(100,100)次の3つの方法で行列()を作成しようとするこのテストコードについて考えてみます。

  1. 事前割り当てなし(宣言I=[]
  2. 事前割り当てあり(宣言I=zeros(100,100)
  3. 割り当てなし(私は何も宣言しません)

コード:

N=1000;
sum0=0;sum1=0;sum2=0;
for q=1:N

    % No pre-allocating
    tic
    I=[];
    for i=1:100
        for j=1:100
            I(i,j)=1;
        end
    end
    a=toc;sum0=sum0+a;

    % with pre-allocation
    tic
    I=zeros(100,100);
    for i=1:100
        for j=1:100
            I(i,j)=1;
        end
    end
    a=toc;sum1=sum1+a;

    % if nothing is declared, I call it no-allocation
    tic
    for i=1:100
        for j=1:100
            I(i,j)=1;
        end
    end
    a=toc;sum2=sum2+a;
end

結果は次のとおりです。

sum0 =1.53790886830589    //no pre-allocation
sum1 = 0.127538555877912  //with pre-allocation
sum2 = 0.120887850271473  //no allocation

3番目の方法(私が書いたり書いI=[]たりしないI=zeros(100,100))が最善のアプローチです!これは私の前の質問でも起こりました。(更新部分を参照)

この方法と最初と2番目の方法の違いは何ですか?

4

1 に答える 1

4

3回目にループを実行Iすると、ワークスペースにすでに存在します。したがって、ループは2番目のループと同じくらい高速ですが、zerosもう呼び出していない点が異なります。

タイミングを計算するときのエラーを回避するために、2回目と3回目にを置き換えることをお勧めします(または各ループの前に呼び出しますI。@ EitanTに感謝します)。JKclear I

編集別の方法として、暗黙の事前割り当てを使用できます。この場合、逆方向にループして、割り当てる最初の要素が配列全体を定義します。

for i=100:-1:1
    for j=100:-1:1
       I(i,j) = 1;
    end
end
于 2012-12-24T15:19:04.880 に答える