13

MATLAB でのベクトル化 (ループ) に関する優れたチュートリアルを探しています。

私は非常に単純なアルゴリズムを持っていますが、2 つのforループを使用しています。ベクトル化するのは簡単であるべきだとわかっているので、解決策を求めるのではなく、その方法を学びたいと思います。

しかし、私が抱えている問題を知らせるために、同様の問題を解決する方法を示す最良のチュートリアルを提案できるように、ここに私の問題の概要を示します。

B = zeros(size(A));    % //A is a given matrix.
for i=1:size(A,1)
   for j=1:size(A,2)
      H = ... %// take some surrounding elements of the element at position (i,j) (i.e. using mask 3x3 elements)
      B(i,j) = computeSth(H); %// compute something on selected elements and place it in B
   end
end

だから、私は解決策を求めていません。MATLAB でのループのベクトル化の例である優れたチュートリアルを求めています。やり方を学んで独学でやりたいです。

4

3 に答える 3

8

これは、このテーマに関するリファレンスとして頻繁にリンクするMathWorksチュートリアルのカップルです。

そして、これがローレンのブログ投稿の1つで、特定のサンプル問題に対するコードのベクトル化の優れたウォークスルーがあります。

与えられた行列の部分行列の処理を含む、サンプルとして与えた特定のタイプの問題は、実行している操作の種類に大きく応じて、さまざまな方法でベクトル化できます。ネストされたforループの代わりに、CONV2またはFILTER2を使用できる場合があります。NLFILTERBLOCKPROCなど、行列の近傍処理とブロック処理を処理する関数もImageProcessingToolboxに多数あります。これらの関数のドキュメントは、コードをベクトル化する方法としてそれらを使用する方法を理解するのに役立つはずです。

于 2010-05-19T17:37:27.903 に答える
3

3 年間毎日 Matlab コードを書き、すべてをベクトル化するのに多くの時間を費やした後に見つけたトリックを説明するために、1 年前に行った小さな記事があります。

http://www.gyomalin.com/reasonable_vectorization.html

主なアイデアは、コードを 1 次元に沿ってベクトル化するだけで、長い道のりを歩むことができるということです。すでにそのトリックを発見した人もいるかもしれませんが、Matlab の設計パターンと呼ぶ価値があると思います。

于 2011-04-26T20:27:53.200 に答える
1

経験則では、可能な限り、ループの代わりに配列を操作する組み込みのmatlab関数を使用する必要があります。たとえば、あなたが説明した問題は畳み込みとして定式化でき、matlabconv2()またはfilter()関数を使用してループなしで実装できるように思われます。

もう1つの一般的なトリックは、行列演算の観点から問題を定式化することです。

また、時間と空間のトレードオフを優先する必要があります。n次元のベクトルvとmxn行列Mがあり、すべての行がn次元のベクトルであるとします。vとのすべての行の間のユークリッド距離が必要だとしますM。この場合、を使用repmat()して、のm個のコピーを含む行列を作成しv、ループのない要素ごとの配列演算を使用して距離を計算する必要があります。

于 2010-05-19T17:40:27.410 に答える