0

したがって、3Dポイントの参照セット(Rと呼びましょう)と他の多くの3Dポイントのセット(データポイントのセットのセットPとそのPi内の各データセットと呼びましょう)があります。

タスクは、いくつかのPiとRのデータポイントのユークリッド距離を最小化するPiを返すことです。私が見る方法は次のとおりです。

  1. Piの各ポイントについて、Rの各ポイントと比較し、2つのポイント間の最小の差を見つけます。
  2. これらの最小距離を合計して、PiとRの間の最小の合計「差」に到達します。
  3. 答えの円周率は、差が最も小さいものです。

しかし、これは本質的にRのすべてのポイントとPのすべてのポイントの間の距離を調べることを意味するため、かなりクレイジーです。これは数千または数百万になる可能性があります。きっと私はそれよりもうまくやれる。

私は慣れていないMatlabで働いています。

使用するのに適したアルゴリズムは何ですか?これに最適なデータ構造はありますか?(たとえば、KDツリー?)

4

1 に答える 1

1

これが実際にパフォーマンスの問題になるほどのクレイジーな量のポイントがない限り、特にこれらの操作はMatlabで高度にベクトル化できるため、すべてのポイントを比較するのが本当に最も簡単な解決策です。

例えば:

R = [1 2 3; 1 3 4];
P{1} = [2 3 5;1 1 2;2 1 3];
P{2} = [4 4 4];

nP = length(P);
sumMinDist = zeros(nP,1);

%# make R into n-by-1-by-3 already
Rperm = permute(R,[1 3 2]);

for iP = 1:nP

%# since we want to sum up the minima, we need to take the square root
allDist = sqrt( sum( bsxfun(@minus, Rperm, permute(P{iP},[3 1 2])).^2, 3));

%# sum the minima (you may want to consider
%# taking the mean instead!)
sumMinDist(iP) = sum(min(allDist,[],1));

end

%# now we can identify the closest set
[~,idxOfClosestSet] = min(sumMinDist);
于 2012-05-08T16:46:16.210 に答える