4

Java で基本的なプログラミングを学んだ後、現在のアルゴリズム コースから MatLab に移行する際の最も難しい部分は、ループを回避することであることがわかりました。MatLab で操作をベクトル化するスマートな方法がたくさんあることは知っていますが、私の心はループ思考に「行き詰まって」おり、コードをベクトル化する方法を直感的に理解するのが難しいと感じています。それがどのようにできるかを見せられたら、それは私には理にかなっていますが、私自身はそう簡単にはわかりません. 現在、ラグランジュ補間で使用される重心の重みを見つけるための次のコードがあります。

function w = barycentric_weights(x);
% The function is used to find the weights of the
% barycentric formula based on a given grid as input.

n = length(x);
w = zeros(1,n);

% Calculating the weights
for i = 1:n
    prod = 1;
    for j = 1:n
        if i ~= j
            prod = prod*(x(i) - x(j));
        end
    end
    w(i) = prod;
end
w = 1./w;

私はMatLabでこれを行うためのよりスマートな方法があるに違いないと確信していますが、私はそれを考えることはできません. 誰かに何かヒントがあれば、私はとても感謝しています:)。そして、MatLab のすべてのベクトル化のトリックを学習する唯一の方法は、上記のようなさまざまなシナリオでそれらがどのように使用されるかを確認することです。

4

3 に答える 3

3

クリスチャン、コードをベクトル化する方法はたくさんあります。すでに 2 つ取得しています。(そして、私は shakinfree に同意します。1) ベクトル化されていない形式で実行するのにかかる時間を常に考慮する必要があります (したがって、ベクトル化によってどれだけの時間を節約できるかがわかります)。2) ベクトル化にかかる時間 (そのため、時間をかける価値があるかどうかをよりよく理解できます。3) 呼び出す回数 (繰り返しますが、実行する価値はありますか)。3) 読みやすさ。shakinfree が示唆しているように、1 年後に自分のコードに戻って、実装したことについて頭を悩ませたくはありません。少なくとも、適切にコメントしたことを確認してください。

しかし、メタレベルでは、ベクトル化によってランタイム パフォーマンスを改善する必要があると判断した場合は、最初に小さな (3x1 ?) 配列から始めて、各反復で何が起こっているかを正確に理解してください。次に、このドキュメントを読み、関連するリンクをたどります。

http://www.mathworks.com/help/releases/R2012b/symbolic/code-performance.html

これは、いつ、どのようにベクトル化するかを決定するのに役立ちます。

ハッピー MATLABbing!

ブレット

于 2012-10-25T22:08:32.940 に答える
3

for ループを回避するには、matlab で創造的になる必要があります。

[X,Y] =meshgrid(x,x)
Z = X - Y
w =1./prod(Z+eye(length(x)))
于 2012-10-25T21:48:57.907 に答える
2

ベクトル化の魅力は理解できますが、1 か月後にコードに戻って意味不明なことをすべて解読しなければならないときに、実際にどれだけの時間を節約できるかを自問することがよくあります。あなたの現在のコードはきれいで明確だと思います。パフォーマンスが本当に重要でない限り、それを台無しにすることはありません。しかし、ここであなたの質問に答えることが私の最善の努力です:

function w = barycentric_weights_vectorized(x)
    n = length(x);
    w = 1./prod(eye(n) + repmat(x,n,1) - repmat(x',1,n),1);
end

それが役立つことを願っています!

xそして、ここでは行ベクトルであると想定しています。

于 2012-10-25T21:47:12.490 に答える