3

M平面間の測定角度の行列があります

 0    52    77    79
52     0    10    14
77    10     0     3
79    14     3     0

平面間の既知の角度のリストがあります。これは、名前を付けた N 行 N 列の行列rhoです。以下はそのサブセットです (大きすぎて表示できません)。

 0    51    68    75    78    81    82
51     0    17    24    28    30    32
68    17     0     7    11    13    15
75    24     7     0     4     6     8
78    28    11     4     0     2     4
81    30    13     6     2     0     2
82    32    15     8     4     2     0

私の使命は、角度rhoが測定された角度に最も近い M 平面のセットを見つけることです。たとえば、上に示した平面の測定角度は、平面 1、2、4、および 6 の間の既知の角度に比較的近いです。

別の言い方をすれば、測定した距離のセットと一致する距離行列 (コサイン関連の距離を使用) 内のポイントのセットを見つける必要があります。これは型に模様を合わせることとも考えられます。

私の問題では、M=5 と N=415 です。

私は本当にそれについて頭を悩ませようとしましたが、時間がなくなりました。したがって、現在私は最も単純な方法を使用しています: 3 つの平面のすべての可能な組み合わせを繰り返しますが、これは遅く、現在 M=3 に対してのみ記述されています。次に、一致するスコアで並べ替えられた一致する平面のリストを返します。

function [scores] = which_zones(rho, angles)
    N = size(rho,1);
    scores = zeros(N^3, 4);
    index = 1;
    for i=1:N-2
        for j=(i+1):N-1
            for k=(j+1):N
                found_angles = [rho(i,j) rho(i,k) rho(j,k)];
                score = sqrt(sum((found_angles-angles).^2));
                scores(index,:)=[score i j k];
                index = index + 1;
            end
        end;
    end
    scores=scores(1:(index-1),:); % was too lazy to pre-calculate #
    scores=sortrows(scores, 1);
end

役立つかもしれないと感じていpdist2ますが、どうすればよいかわかりません。これを理解するための助けをいただければ幸いです。

4

1 に答える 1

1

最近点検索用の http://www.mathworks.nl/help/matlab/ref/dsearchn.html がありますが、同じ次元が必要です。それはただの特別な問題なので、とにかく力ずくで見つけなければならないと思います。

これは、2番目のマトリックスのすべての一意の組み合わせをブルートフォース反復し、 を計算するscore方法です。その後、スコアが最小のものを見つけることができます。

A=[ 0    52    77    79;
   52     0    10    14;
   77    10     0     3;
   79    14     3     0];
B=[ 0    51    68    75    78    81    82;
   51     0    17    24    28    30    32;
   68    17     0     7    11    13    15;
   75    24     7     0     4     6     8;
   78    28    11     4     0     2     4;
   81    30    13     6     2     0     2;
   82    32    15     8     4     2     0];

M = size(A,1);
N = size(B,1);

% find all unique permutations of `1:M`
idx = nchoosek(1:N,M);
K = size(idx,1); % number of combinations = valid candidates for matching A

score = NaN(K,1);
idx_triu = triu(true(M,M),1);
Atriu = A(idx_triu);

for ii=1:K
    partB = B(idx(ii,:),idx(ii,:));
    partB_triu = partB(idx_triu);
    score = norm(Atriu-partB_triu,2);
end

[~, best_match_idx] = min(score);
best_match = idx(best_match_idx,:);

あなたの例の解決策は実際には[1 2 3 4]であるため、 の左上部分は ではBありません[1 2 4 6]

これは理論的には問題を解決しますが、このアルゴリズムを高速化する方法がわかりません。ただし、多数の場合はまだ遅くなります。たとえば、 と の場合M=5、可能な解決策となる組み合わせがN=415あります。セレクタ インデックスを生成するだけでは 32 ビットでは不可能です。100 128 170 583B

NxNここでの本当の最適化は、前のフィルタリング部分でマトリックス内のいくつかの平面を切り取ることにあると思います。

于 2013-07-07T18:17:01.360 に答える