2012-03-09 17 views
0

私は、そのポイントと一緒に距離dにあるマトリックス内のポイント座標のすべてのネイバーを求めます。マトリックス+ matlabで距離dの近傍を見つけよう

このような部分行列を生成する最も効率的な方法は何ですか?例えば

自体のサイズは3×3であるので、私は結果として、行列Aを取得します5としてではなくd = 1ためA = [ 1 , 2 , 3 ; 4 , 5 , 6 ; 7 ,8 ,9]

はその後d = 0 and data 5のために、私は答えを得るならば。

インデックスがマトリックスに存在しない場合は、その時点で0を取得する必要があります。

のでdata point 2 and d = 1のための答えは、私はそれを行うことができますどのように[ 0 , 0 , 0 ; 1 , 2 ,3 ; 4 , 5 , 6]

でしょうか?

答えて

0

はこれを試してみてください作っ... did'ntは本当にチェックする!

+0

オクターブはpadarrayを知らない:-(しかし、それがとてもコンパクトであればいい –

0

ここに解決策があります。私はそれを関数に変えておきます。 nはサブアレイの中央の値を示します。例では5です。

z = zeros(size(A,1)+2*d,size(A,2)+2*d); 
z(d+1:d+size(A,1),d+1:d+size(A,2)) = A; 
[r,c] = find(z==n); 
z(r-d:r+d,c-d:c+d) 

EDIT

として不十分で私の以前の試みとしてテストされ、このバージョンを、試してみてください。これは、find式が複数の場所を返す場合でも対処しません。

私はまだこれの効率について保証しません。

+0

ケースn = 2、d = 1(=> r = 1)は、r-d = 0 =>ゼロのサブインデックス –

+0

を与えます。 –

+0

それは間違っています...私はr、cを知っていると仮定することができますが、それでも私は隣人の面で私に間違った答えを与えています – anon

0

あなたがAの中にいる場合は、d=0data_point=5の代わりにdata_point=[2,2]としてください。あなたはそれが5として与えられている場合は、あなたの質問をどのように解釈するかによって、ハイの答えのように、見つける

ij = [ceil(data_point/size(A,1)), rem(data_point-1, size(A,1))+1] 

によって変換するか、または使用することができます。

次の関数

function B = find_neigh(A,ij,d) 
imin = max(ij(1)-d,1); 
imax = min(ij(1)+d,size(A,1)); 
jmin = max(ij(2)-d,1); 
jmax = min(ij(2)+d,size(A,2)); 
B = zeros(2*d+1,2*d+1); 
r1 = max(2-ij(1)+d,1); 
c1 = max(2-ij(2)+d,1); 
B(r1:r1+imax-imin, c1:c1+jmax-jmin) = A(imin:imax,jmin:jmax); 

はあなたに望ましい結果を返す必要があります。

A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; 
find_neigh(A,[1,2],1) 

を編集して、たとえばそれを呼び出す:私はそれが動作を期待

A = padarray(A , [d d]) 
% assuming the data is at r row and c col do the following 

A(r : r + 2d , c : c + 2 d) 

... 2、なし3つのバグを修正し、その機能

+0

ああ、あなたもそれは間違っている! –

+0

私の修正についてはどういう意味ですか、もう一度間違いを見つけましたか? –

+0

@Kyss、元の投稿ではありません。あなたのコードはまったくテストされていません。 Crikey、私はほとんどテストしていない。 –