好吧,我不知道怎么用 Headers 来描述我的问题,我希望我得到的那个是正确的 .
我有一个矩阵(在下面的例子中是 M
),这是一个3D图像,在这种情况下,由11x11x11体素组成(我认为它只是为了方便,大小只是一个例子) .
在我的代码中,我需要到达一些体素的26个邻居,为此我使用了一些奇特的线性索引:http://www.mathworks.com/matlabcentral/answers/86900-how-to-find-all-neighbours-of-an-element-in-n-dimensional-matrix
问题是,如果 point
位于"boundary"的"boundary"中,则尝试访问某些超出范围的值,这将产生错误 .
要解决这个问题,一个好的方法是在 M
周围创建一个边界,使其在每个维度上都有2个大小,并用零填充,但是 I really would like to avoid changing M ,因为我的代码比示例中的代码复杂得多 .
我找不到任何办法,我有点卡在这里 . 有什么建议吗?
EDIT: @Dan答案有效,但是我想看看是否有使用这种线性索引方法的可能解决方案 .
% Example data
M=round(randn(11,11,11))~=0;
% Fancy way of storing 26 neigh indices for good accesing
s=size(M);
N=length(s);
[c1{1:N}]=ndgrid(1:3);
c2(1:N)={2};
neigh26=sub2ind(s,c1{:}) - sub2ind(s,c2{:});
point=[5 1 6];
% This will work unless the point is in the boundary (like in this example)
neighbours=M(sub2ind(s,point(1),point(2),point(3))+neigh26)
2 回答
Basic theory: 使用
NaNs
将输入数组扩展为left-right
,up-down
,one more on each sides of the third dimension
. 这将允许我们使用统一的3x3x3
网格,然后使用那些NaNs
来检测超出输入数组边界的元素,因此将被丢弃 .Code
How to use: 因此,
4th
维度中的每个切片表示27
元素(邻近加上元素本身)为3x3x3
数组 . 因此,neigh26
将是3x3x3xN
数组,其中N
是点数组中的点数 .Example: 例如,让我们假设
M
和Point
中的一些随机值 -在使用这些输入运行早期代码时,我得到这样的东西 -
那线性索引的东西是必不可少的吗?因为处理边界条件非常容易,所以你使用下标索引和
min
和max
这样:这样,如果您想要更广泛的社区,您也可以轻松地概括这一点:
或者如果您喜欢保持立方体形状,那么可能:
如果你想在代码中多次使用它,最好将它重构为只返回索引的m文件函数: