1

満足のいく位置マトリックスを作成しました。このマトリックスの各位置(または要素)について、マトリックス内の他のすべての位置間の位置距離を計算します。このようにして、他の要素が別の要素からの方向を取得できます。私はこれを次のようにしようとしました:

pos = [X(:),Y(:),Z(:)];

for j = 1:length(pos)
for i = 1:length(pos)
    vecdir(i,:,:) = pos(i,:,:) - pos(j,:,:);
end
    v(i) = {vecdir};
    i = i+1;
end

ここで、各セルは、位置マトリックスの位置ごとの位置距離を保持します。v(i)は、最後の計算のみを格納しているように見えます(つまり、位置マトリックスの最後の位置の正しい情報を保持している最後のセルを除いて、すべてのセルが空です)。ここでどこが間違っているのですか?また、これを行うためのより効率的な方法がある場合は、セル配列の格納とアクセスによってプログラムの速度が大幅に低下することを知っているので、知りたいと思います。

4

3 に答える 3

1

ループオーバーの最後に、これらのステートメントは何をしていますjか?

v(i) = {vecdir};
i = i+1;

私があなたのコードを読んでいるとき、これらは常にに設定さv(length(pos))れて{vecdir}からに追加1されiます。この更新されたの値は、次に内側のループを回るときにiリセットされる(に)前に使用されることはありません。1

あなたのコードの残りの部分が大丈夫だとは言えません。あなたの質問に完全に従うかどうかはわかりませんが、これらのビットは少し怪しいにおいがします。

于 2012-08-06T11:00:07.473 に答える
1

彼らは常にpdist2です:

dist = pdist2(pos,pos);

これは距離ベクトルのノルムを与えます。

距離ベクトルも必要な場合は、次のようなものを使用します。

N = size(pos,1);
v = arrayfun(@(ii) bsxfun(@minus,pos,pos(ii,:)),1:N,'uni',false)

Nx1これはセル配列を返します。各セルpos(ii,:)には、他の位置までの距離ベクトルが含まれています。

いくつかのエラーはありますが、コードは同じように見えます。私はあなたが次のことをするつもりだったと思います:

N = size(pos,1);
v = cell(N,1);
for j = 1:N
    for i = 1:N
        vecdir(i,:) = pos(i,:) - pos(j,:);
    end
    v{j} = vecdir;
end
于 2012-08-06T11:49:44.750 に答える
0
x = repmat(X(:), 1, numel(X));
y = repmat(Y(:), 1, numel(Y));
z = repmat(Z(:), 1, numel(Z));

dst = sqrt((x - x') .^ 2 + (y - y') .^ 2 + (z - z') .^ 2);
于 2012-08-06T12:12:15.320 に答える