3

2セットの行列(AB )があり、各行列内にいくつかの点座標が含まれていると仮定し、 Aに最も近いBの点を見つけて、それに応じて最も近い点ペア座標をリストしたセル配列Cと1つのセル配列Dを出力します。ペアになっていないスポットを登録するにはどうすればよいですか?

具体的には、これが私が欲しいものです

2セットの行列にはスポットxy座標が含まれています。

A=[ 1 2; 3 4]; B=[1 3; 5 6; 2 1];

取得したいですC{1,1}=[1 2; 1 3]; C{2,1}= [3 4; 5 6]; D{1,1}=[2 1];

助けてくれてありがとう。

4

2 に答える 2

4

この問題の解決策は 1 つだけではありません。たとえば、(1 次元ですが、ND に拡張可能) の場合を考えてみましょう。

A= [1; 3];
B= [2];

次に、またはのいずれA(1)A(2)が残りのポイントになる可能性があります。アルゴリズムがどの点を吐き出すかは、アルゴリズムがどのように機能するか、つまり最も近い点を見つけるために最初に取る点によって異なります。

そのようなアルゴリズムは、

  1. A(i)との各組み合わせ間の距離を求めB(j)ます。統計ツールボックスがある場合、pdist2がこれを行います。

    A=[ 1 2; 3 4];
    B=[1 3; 5 6; 2 1];
    dist = pdist2(A,B);
    
  2. Aorの最小値をループしB(例では A が最小であるため、A を使用します)、Aの残りのセットで最も近い点の各点を検索しBます。

    N = size(A,1);
    matchAtoB=NaN(N,1);
    for ii=1:N
        dist(:,matchAtoB(1:ii-1))=Inf; % make sure that already picked points of B are not eligible to be new closest point
        [~,matchAtoB(ii)]=min(dist(ii,:));
    end
    matchBtoA = NaN(size(B,1),1);
    matchBtoA(matchAtoB)=1:N;
    remaining_indices = find(isnan(matchBtoA));
    
  3. 結果を目的の出力行列に結合し、次のようにしCますD

    C=arrayfun(@(ii) [A(ii,:) ; B(matchAtoB(ii),:)],1:N,'uni',false);
    D=mat2cell(B(remaining_indices,:),ones(numel(remaining_indices),1),size(B,2));
    

このコードは 1D ポイント以上 (ND) でも機能することに注意してください。これにより、pdist2すべてがスカラー距離に平坦化されます。

于 2012-08-23T07:11:45.827 に答える
0

これが問題に対する私の見解です:

A=[1 2
   3 4]; 

B=[1 3
   5 6
   2 1];

dists = pdist2(A,B);

[dists, I] = sort(dists,2);

c = NaN(size(A,1),1);
for ii = 1:size(A,1)    
    newC = find(~any(bsxfun(@eq, I(ii,:), c), 1));
    c(ii) = I(ii,newC(1));
end

C = cellfun(@(x)reshape(x,2,2).',...
        mat2cell([A B(c,:)], ones(size(A,1),1), 4), 'uni', false);
D = {B(setdiff(1:size(B,1),c), :)}

このソリューションは、

  • すべてのベクトルは2Dです
  • Aとの行に積み重ねられたB
  • そしてA常にソースです(つまり、すべてがと比較されますA

これらの仮定が(常に)当てはまらない場合は、@ GuntherStruyfによって提案されたような、より一般的なアプローチをとる必要があります。

于 2012-08-23T07:34:22.127 に答える