三维矩阵中周围单元的索引和值

Ale*_*x L 5 matlab matrix

我想在3d矩阵中返回单元格周围的8个单元格的索引和值.

mat = rand(5,5,5);

% Cell of interest
pos = [3 3 3]
pos_val = mat(pos(1), pos(2), pos(3))

% Surrounding cells
surrounding_pos = [pos(1)-1:pos(1)+1; pos(2)-1:pos(2)+1; pos(2)-1:pos(2)+1]
surrounding_val = mat(surrounding_pos(1,:), surrounding_pos(2,:), surrounding_pos(3,:))
Run Code Online (Sandbox Code Playgroud)

这适用于矩阵中心的值,但如果pos位于边缘,则会中断.(例如,如果pos是[3,4,5],则around_pos 将包括[3,4,6],这是超出范围)

我显然可以删除around_pos值<0或> size(mat),但这似乎不是一个非常糟糕的MATLABian方法.有任何想法吗?

Gun*_*uyf 5

此处讨论的解决方案相同,但扩展到多个(任何)维度:

mat = randi(10,5,5,5);
siz = size(mat );
N = numel(siz); % number of dimensions
M = 1; % surrounding region size

pos = [3 3 3];
pos_val = mat(pos(1), pos(2), pos(3));

surrounding_pos = cell(N,1);
for ii=1:N
    surrounding_pos{ii} = max(1,pos(ii)-M):min(siz(ii),pos(ii)+M);
end
surrounding_val2 = mat(surrounding_pos{:});
Run Code Online (Sandbox Code Playgroud)

最重要的部分是最后四行,它避免了为每个维度c/p最大,最小的东西.

或者,如果您喜欢短代码,则循环更改为arrayfun:

surrounding_pos = arrayfun(@(ii) max(1,pos(ii)-M):min(siz(ii),pos(ii)+M), 1:N,'uni',false);
surrounding_val2 = mat(surrounding_pos{:});
Run Code Online (Sandbox Code Playgroud)


Col*_*ers 4

这是一个整理后的版本。干杯。

mat = rand(5,5,5);
N = size(mat)
if length(N) < 3 || length(N) > 3; error('Input must be 3 dimensional'); end;
pos = [1 3 5]
surrounding_val = mat(max(pos(1)-1, 1):min(pos(1)+1, N(1)), max(pos(2)-1, 1):min(pos(2)+1, N(2)), max(pos(3)-1, 1):min(pos(3)+1, N(3))) 
Run Code Online (Sandbox Code Playgroud)

编辑:添加了错误陷阱。