2013-04-22 73 views
3

我需要訪問3D中某個點周圍的多個索引。 例如,對於點(x1,y1,z1),我需要獲取其3x3x3鄰域的所有索引,使得(x1,y1,z1)居中。對於大小爲3的附近,我避免sub2ind,ind2sub matlab

[x,y,z] = meshgrid(-1:1,-1:1,-1:1); 
x_neighbors = bsxfun(@plus,x,x1); 
y_neighbors = bsxfun(@plus,y,y1); 
z_neighbors = bsxfun(@plus,z,z1); 

這裏做到這一點,我在加入從(X1,Y1,Z1)的距離,以任何點中心X1,Y1,Z1到(0,0,0) 3x3x3盒子。

給出了(x1,y1,z1)3x3x3鄰域的座標。然後我需要把它們變成線性指標,所以我可以訪問它們:

lin_ind = sub2ind(size(volume),y_neighbors,x_neighbors,z_neighbors); 

這是我做的成本很高。

我的問題是,如何避免sub2ind。如果INX的(X1,Y1,Z1)的線性指標,

inx = sub2ind(size(volume),y1,x1,z1); 

我怎麼能找到通過增加或減少或INX公司的任何其他操作簡單的線性指標的3x3x3的鄰里關係?

+0

爲什麼你需要線性索引?你在做什麼操作?難道你不能像M(x_neighbors,y_neighbors,z_neighbors)那樣得到鄰居嗎?你也可以只做到這一點,而不是meshgrid等:'M(x_neighbors-1:x_neighbors + 1,y_neighbors-1:y_neighbors + ... etc' – Dan 2013-04-22 10:04:59

+2

你可以永遠做'陣列(1 +行* J +行*的cols * K)計算的'型自己......只要看看sub2ind'如何'做它和相關部分複製粘貼。 – 2013-04-22 10:09:55

+0

@丹,無法訪問M(y_n,x_n,z_n),因爲我只需要部分在3x3x3的鄰居,(我申請的指數口罩),所以我其實已經是x_list,y_list,z_list和訪問M(y_list,x_list,z_list)給出了y_list,x_list,z_list所有位置,而不是它們的組合。 ......我不能用你的其他建議,因爲我有很多點(P1,... PN),而不是隻有一個(X1,Y1,Z1),我需要做快.. – matlabit 2013-04-22 10:14:21

回答

1

只要知道3D數組的尺寸,就可以計算3x3x3鄰域中所有元素的線性偏移量。爲了說明這一點,考慮一個4x5矩陣的二維實例。線性指數如下:

1 5 9 13 17 
2 6 10 14 18 
3 7 11 15 19 
4 8 12 16 20 

10的3x3鄰域是[5 6 7 9 10 11 13 14 15]。 15的3x3鄰域是[10 11 12 14 15 16 18 19 20]。如果我們減去中心元素的指數,在這兩種情況下我們得到[-5 -4 -3 -1 0 1 3 4 5]。更一般地,對於MxN矩陣,我們將有[-M-1 -M -M+1 -1 0 1 M-1 M M+1]或[(-M + [ - 1 0 1])-1 0 1(M + [ - 1 0 1])]

如果數組是MxNxP,來自中心元素的線性索引偏移將爲[(-M*N+[-M-1 -M -M+1 -1 0 1 M-1 M M+1]) [-M-1 -M -M+1 -1 0 1 M-1 M M+1] (M*N+[-M-1 -M -M+1 -1 0 1 M-1 M M+1])]。如果您願意,您可以將其重塑爲3x3x3。

請注意,這種索引不能很好地處理邊緣;如果你想在陣列的邊緣找到一個元素的鄰居,你應該首先在所有的邊上填充數組(從而改變M,N和P)。

+0

中提到了謝謝!這正是我想要的。我只是需要將它推廣一點,對於較大的鄰域(而不僅僅是3X3),所以要採取你所做的,該系列應該上升到floor(neighborhood_size/2),例如對於5X5:floor(5/2 )= 2,我將得到:[-M-2 -M-1 M -M + 1 -M + 2 -2 -1 0 ....](與正數相同)。謝謝 !!! – matlabit 2013-04-29 08:56:32

0

只需添加(廣義)代碼到@nhowe答案: 這是大小5×5×,因此R(半徑)的附近的例子是2:

ns = 5; 
r = 2; 

[M,N,D] = size(vol); 
rs = (1:ns)-(r+1); 
% 2d generic coordinates: 
neigh2d = bsxfun(@plus, M*rs,rs'); 
% 3d generic coordinates: 
pages = (M*N)*rs; 
pages = reshape(pages,1,1,length(pages)); 

neigh3d = bsxfun(@plus,neigh2d,pages); 

得到任何線性的任何鄰域卷的索引,只需將線性索引添加到neigh3d:

new_neigh = bxsfun(@plus,neigh3d, lin_index); 
+0

我知道這是一個老問題,但是從'neigh2d',我如何訪問矩陣的值,因爲'neigh2d'中的座標包含負值?我只考慮二維矩陣。 – 2017-05-25 03:49:01