2017-08-08 11 views
3

は、以下の2つのベクトルの事前割り当てを検討してください。MATLABインデックスの表記は

vecCol = NaN(3, 1); 
vecRow = NaN(1, 3); 

今の目標は、(ベクトル化が不可能な場合、例えばループ内で)、これらのベクターに値を割り当てることです。インデックス作成に関するコンベンションやベストプラクティスはありますか?

次の方法をお勧めしますか?

for k = 1:3 
    vecCol(k, 1) = 1; % Row, Column 
    vecRow(1, k) = 2; % Row, Column 
end 

次のようにコードする方がよいでしょうか?

for k = 1:3 
    vecCol(k) = 1; % Element 
    vecRow(k) = 2; % Element 
end 

答えて

6

機能的に違いはありません。 コンテキストがベクトルが常に1Dであることを意味する場合(この例の命名規則が役立ちます)、簡潔さと柔軟性のためにvecCol(i)を使用することができます。ただし、vecCol(i,1)構文を使用するといくつかの利点があります。

  • 使用しているベクターの種類は明白です。それが重要であればこれは良いことです。線形代数を使用する場合は、方向が任意の場合は無関係かもしれません。
  • あなたが初期化するのを忘れた場合は(悪いが、それは起こります)、それは方向性を保証します
  • 予想通りであることは、それが表示され、2D配列に
  • を使用するときに、あなたが忘れていないに入るために良い習慣ですやや速くなります。これは小さな配列ではごくわずかですが、10^8要素のベクタマークと、> 10%の速度向上のベンチマークを参照してください。

    function benchie() 
    % Benchmark. Set up large row/column vectors, time value assignment using timeit. 
        n = 1e8; 
        vecCol = NaN(n, 1); vecRow = NaN(1, n); 
        f = @()fullidx(vecCol, vecRow, n); 
        s = @()singleidx(vecCol, vecRow, n); 
        timeit(f) 
        timeit(s) 
    end 
    function fullidx(vecCol, vecRow, n) 
    % 2D indexing, copied from the example in question 
        for k = 1:n 
         vecCol(k, 1) = 1; % Row, Column 
         vecRow(1, k) = 2; % Row, Column 
        end 
    end 
    function singleidx(vecCol, vecRow, n) 
    % Element indexing, copied from the example in question 
        for k = 1:n 
         vecCol(k) = 1; % Element 
         vecRow(k) = 2; % Element 
        end 
    end 
    

    出力(Windowsの64ビットR2015bでテストされ、あなたの走行距離は変更になる場合があります!)

    % f (full indexing): 2.4874 secs 
    % s (element indexing): 2.8456 secs 
    

    反復処理nの増加に対するこのベンチマークは、我々は参照のために、次のプロットを生成することができます。

    enter image description here

4

プログラミングにおける一般的な経験則は、「明示的、暗黙的よりも優れている」です。

  • コンテキストは行列代数の多くを使用して、行と列のベクトル間の区別がある場合:2の間には機能的な違いはありませんので、私はそれがきれい/優れている1文脈に依存して言うだろう1引数のインデックスを使用して、コンテキストは2の間であまりdisciminateていないとあなただけのベクトルにとして単純な配列を使用している場合に重要な、バグを減らし、

  • を読みやすくするために2引数のインデックスを使用するには、クリーナーです

関連する問題