1

コードを最適化しようとしていますが、この特定のセクションをベクトル化する方法と方法がわかりません。

for base_num = 1:base_length
    for sub_num = 1:base_length
    dist{base_num}(sub_num) = sqrt((x(base_num) - x(sub_num))^2 + (y(base_num) - y(sub_num))^2);
    end
end
4

1 に答える 1

1

次の例は、ベクトル化の 1 つの方法を示しています。

%# Set example parameters
N = 10;
X = randn(N, 1);
Y = randn(N, 1);

%# Your loop based solution
Dist1 = cell(N, 1);    
for n = 1:N
    for m = 1:N
        Dist1{n}(m) = sqrt((X(n) - X(m))^2 + (Y(n) - Y(m))^2);
    end
end

%# My vectorized solution
Dist2 = sqrt(bsxfun(@minus, X, X').^2 + bsxfun(@minus, Y, Y').^2);
Dist2Cell = num2cell(Dist2, 2);

でのクイック スピード テストでN = 1000は、ベクトル化されたソリューションがループ ソリューションよりも 2 桁速く実行されます。

注: ベクトル化されたソリューションで 2 行目を使用して、セル配列の出力構造を模倣しました。含めるか、2 つを組み合わせて 1 行にするかはあなた次第です。

ちなみに、質問にコードを投稿するための+1。ただし、将来のための2つの小さな提案:1)SOに投稿するときは、回答にあるように、特にループ添え字の場合は単純な変数名を使用してください。2) サンプル コードをスクリプトに直接コピー アンド ペーストし、変更や追加を行わずに実行できると便利です (私の回答のように)。これにより、より迅速にソリューションに収束できます。

于 2012-12-10T01:57:01.943 に答える