如何在Matlab中快速计算2D、3D、4D及ND坐标的邻域点?
问题
假设存在以下坐标定义:
2D: x, y 3D: x, y, z 4D: x, y, z, k ND: x, y, z, k, ...
以2D坐标为例,其可能的邻域点包括:x - 1, y、x + 1, y、x, y - 1、x, y + 1、x + 1, y + 1、x - 1, y - 1、x + 1, y - 1、x - 1, y + 1。可见邻域点组合数量较多,请问在Matlab语言中是否有更简便的方法计算这些坐标?
解决方法
当然有,Matlab里可以通过生成偏移量矩阵的方式快速得到任意维度的邻域坐标,无需手动枚举每一个组合:
方法1:利用ndgrid生成全邻域偏移(通用任意维度)
先定义每个维度的偏移范围[-1, 0, 1],再通过ndgrid扩展为多维网格,最后整理成坐标偏移矩阵:
% 设置目标维度(比如2D就设为2,3D设为3) dim = 2; % 为每个维度生成[-1,0,1]的偏移选项 offsets = repmat({-1:1}, 1, dim); % 生成多维偏移网格并转为列向量格式 [grid_offsets{1:dim}] = ndgrid(offsets{:}); offset_matrix = cell2mat(cellfun(@(x) x(:), grid_offsets, 'UniformOutput', false)); % 剔除中心自身(偏移全为0的点) offset_matrix = offset_matrix(all(offset_matrix ~= 0, 2), :);
运行后offset_matrix就是对应维度下所有邻域的偏移量。给任意中心坐标[x0, y0],直接相加就能得到所有邻域点:
center = [x0, y0]; neighbors = center + offset_matrix;
这种方法完全支持N维场景,比如3D时只需把dim改成3,就能自动生成26个邻域点的偏移量。
方法2:利用permutations(适合低维度场景)
如果仅处理2D/3D这类低维度场景,也可以用permutations配合去重生成偏移,但通用性不如第一种:
% 生成2D邻域偏移 offsets = unique(permutations([-1,0,1,-1,0,1]), 'rows'); offsets = offsets(all(offsets ~= 0, 2), :);
内容的提问来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

