gpt4 book ai didi

matlab - 体素邻域索引 - 使用线性索引在 26 个邻域访问中检测 "out of bounds"

转载 作者:太空宇宙 更新时间:2023-11-03 19:59:47 25 4
gpt4 key购买 nike

嗯,我不知道如何用标题来描述我的问题,我希望我得到的是正确的。

我有一个矩阵(下例中的 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)

最佳答案

线性索引是必不可少的吗?因为使用下标索引和 minmax 很容易处理边界条件,如下所示:

p = [5, 1, 6];

neighbourhood = M(max(1,p(1)-1)):min(p(1)+1,end),
max(1,p(2)-1)):min(p(2)+1,end),
max(1,p(3)-1)):min(p(3)+1,end))

%// Get rid of the point it self (i.e. the center)
neighbours = neighbourhood([1:13, 15:end])

如果您想要更广泛的社区,您也可以通过这种方式轻松地概括这一点:

p = [5, 1, 6];
n = 2;
neighbourhood = M(max(1,p(1)-n)):min(p(1)+n,end),
max(1,p(2)-n)):min(p(2)+n,end),
max(1,p(3)-n)):min(p(3)+n,end))

%// Get rid of the point it self (i.e. the center)
mid = ceil(numel(neigbourhood)/2);
neighbours = neighbourhood([1:mid-2, mid+1:end])

或者如果您喜欢保持立方体形状,那么也许:

neighbours = neighbourhood;
neighbours(mid) = NaN;

如果您想在代码中多次使用它,最好将其重构为一个只返回索引的 m 文件函数:

function ind = getNeighbours(M,p,n)
M = zeros(size(M));
M(max(1,p(1)-n)):min(p(1)+n,end), max(1,p(2)-n)):min(p(2)+n,end), max(1,p(3)-n)):min(p(3)+n,end)) = 1;
M(p(1), p(2), p(3)) = 0;
ind = find(M);
end

关于matlab - 体素邻域索引 - 使用线性索引在 26 个邻域访问中检测 "out of bounds",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26424074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com