0

4つの列[XYZC]を持つデータセットがあります。[X、Y、Z]を中心とし、半径rの特定の球内にあるすべてのC値を見つけたいと思います。この問題に対処するための最良のアプローチは何ですか?clusterdataコマンドを使用する必要がありますか?

4

2 に答える 2

2

素朴なユークリッド距離を使用する1つの解決策は次のとおりです。

たとえばV = [X Y Z C]、データセットで Center = [x,y,z]あり、球の中心であり、次に

dist = bsxfun(@minus,V(:,1:3),Center);  % // finds the distance vectors 
                                        % // between the points and the center
dist = sum(dist.^2,2); % // evaluate the squares of the euclidean distances (scalars)
idx = (dist < r^2);    % // Find the indexes of the matching points

良いC値は

 good = V(idx,4);  % // here I kept just the C column
于 2012-12-06T20:38:58.453 に答える
0

これは「クラスター分析」ではありません。データ内の構造を発見しようとはしません。

代わりに、あなたがしていることは、一般的に「範囲クエリ」または「半径クエリ」と呼ばれます。従来のデータベース用語ではSELECT、距離セレクターを備えた。

おそらく、ユークリッド距離を使用して球を定義する必要があります。計算の目的では、半径の2乗をとるだけで、ユークリッドの2乗の代わりに実際に有益です。

私はmatlabを使用していませんが、クエリポイントからデータセット内の各インスタンスの距離を計算し、距離が十分に小さいオブジェクトを選択する方法の例がたくさんあるはずです。

Matlabに適したインデックス構造パッケージがあるかどうかはわかりません。しかし、一般的に、3Dでは、これはインデックス構造で十分に加速できます。すべての距離の計算はですO(n)が、インデックス構造のみを使用しO(log n)ます。

于 2012-12-06T21:00:49.537 に答える