0

私はmatlabが初めてです。簡単な例を通して、ベクトル化を理解したいと思います。次のコード スニペットをベクトル化するにはどうすればよいですか。

for i = 1:z
  binno = binno + f*floor(clip(:,:,i)*bins/256);
  f=f*bins;
end

これは非常に単純なコードですが、適切にベクトル化する方法を理解する必要があります。問題は、ループごとに f が再計算されることです。編集: Binno は 2 次元行列、Clip は 3 次元、f とビンはスカラーです。

4

2 に答える 2

3

これは、次の 3 つの手順で行うことができます。

  1. 因子のベクトルを作成します。1 x 1 x z にする

    fact = f .* bins.^(0:z-1);
    fact = reshape(fact,1,1,[]);
    
  2. クリップに係数を掛ける

    tmp = bsxfun(@times,floor(clip*bins/256),fact);
    
  3. すべてを合計する

    binno = sum(tmp,3);
    
于 2013-02-26T18:03:38.027 に答える
1

最初の数回のループの値を書き留めてから、パターンを見つけると役立つ場合があります。ベクトル F (反復ごとに 1 つのエントリ) は最初から始まりますf(それを と呼びましょうf0)。次に、2 番目のエントリはf0*binsです。次にf0*bins^2、などです。そうFf0*[1 bins bins^2 bins^3]... あり、次のように計算できます

F = f0 * bins .^ (0:z-1);

bins^0 は 1 なので。

floorこれより前でも、操作全体を一度に計算できました: floor(clip*bins/256). あとは、P 要素ベクトル F をその 3D 行列 MxNxP で乗算する方法を理解する必要があります。 bsxfunこの種のことを行いますが、次元は一致するか、正確に 1 である必要があります。したがって、F は P ではなく 1x1xP でなければなりません。次に、3 次元に沿ってすべてを合計します。

binno = sum(bsxfun(@times, floor(clip*bins/256), reshape(F, [1 1 length(F)])), 3);

ちょっと注意してください...この質問は、少なくともサイズで定義された入力でより簡単に答えられます。さらに良いのは、正しい次元のサンプル データを生成する数行です。何もないため、上記のコードをテストできませんでした。そのため、データに適応させるのはあなたの責任です。

于 2013-02-26T18:03:14.297 に答える