【发布时间】:2013-04-22 10:00:32
【问题描述】:
我需要访问 3D 中某个点周围的多个索引。
例如,对于点 (x1,y1,z1),我需要获取其 3x3x3 邻域的所有索引,使得 (x1,y1,z1) 居中。对于大小为 3 的邻居,我使用
[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) 到 3x3x3 中任意点的距离相加,将 x1,y1,z1 居中到 (0,0,0)盒子。
这给了我 (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 邻域?
【问题讨论】:
-
为什么需要线性索引?你用这个做什么操作?你不能像
M(x_neighbors, y_neighbors, z_neighbors)这样的社区吗?你也可以这样做而不是网格等:M(x_neighbors-1:x_neighbors+1, y_neighbors-1:y_neighbors+...etc -
您总是可以自己进行
array(i + rows*j + rows*cols*k)类型的计算...只需看看sub2ind是如何计算的,然后复制粘贴相关部分。 -
@Dan,无法访问 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),我需要快速完成..
-
由于 x1, y1, z1 是标量,您不必使用 bsxfun。
x_neighbors = x + x1也可以。 -
@Alex 它们不是标量,只是在这个例子中它们是......它们实际上是一个巨大的数组,我之前在回复 Dan 时提到过
标签: matlab indexing computer-vision bsxfun