嗯,我不知道如何用标题描述我的问题,希望我得到的是正确的。
我有一个矩阵(在下面的示例中为M
),它是一个3D图像,由11x11x11体素组成(我只是为了方便而逻辑化,并且大小也只是一个示例)。
在我的代码中,我需要访问一些体素的26个邻居,为此我使用了一些花哨的线性索引,这些索引可以在http://www.mathworks.com/matlabcentral/answers/86900-how-to-find-all-neighbours-of-an-element-in-n-dimensional-matrix中找到。
问题是,如果point
处于M
的“边界”上,则将尝试访问一些越界值,这将生成错误。
要解决这个问题,一个很好的方法是在M
周围创建一个边界,在每个维度上增加+2大小,并以零填充,但是我真的想避免改变M
,因为我的代码比示例中的代码复杂得多。
我找不到任何方法来做到这一点,我有点卡在这里。 有什么建议吗?
编辑:@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)
2x3x3
,而角落情况是2x2x3
?此外,如果你正在处理多个体素,由于大小不同,因此如果你想一次性获取所有体素的邻居而不使用循环,我认为你肯定需要使用单元数组。 - DivakarM_padded
作为13x13x13
,并索引到M_padded
而不是M
。索引后,NaN
元素将指示边界point
的"无效"元素。这种方法适合你吗? - Divakarbsxfun
的有趣代码,我想我可以和你一起运行。 - Divakar