matlab - 避免 sub2ind 和 ind2sub

标签 matlab indexing computer-vision bsxfun

我需要访问 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) 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 邻域?

最佳答案

只要知道 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。

请注意,这种索引不能很好地处理边缘;如果你想在数组的边缘找到一个元素的邻居,你应该先在数组的所有边上填充(从而改变 MNP).

关于matlab - 避免 sub2ind 和 ind2sub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16144291/

相关文章:

mysql - MySQL 是否在 Having 上使用索引?

opencv - opencv_traincascade CvCascadeClassifier::fillPassedSamples 中的无限循环

python - 要保存的变量应该在字典或列表中传递

c++ - OpenCV 垫 -> Matlab 垫文件

MySQL 什么时候可以使用 HASH 而不是 BTREE

matlab - .mat 文件作为 caffe 深度学习网络的输入

sql - Oracle 优化器尴尬地不喜欢使用索引

python - 如何在 Python 中提高 OpenCV 匹配结果的准确性

arrays - MATLAB 中每行出现的索引

image - 在保留标题和标签的同时删除子图中的死角