我想在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,:))
这适用于矩阵中心的值,但如果pos位于边缘,则会中断。 (例如,如果pos为[3,4,5]
,则surround_pos将包含[3,4,6]
,其超出范围)
我显然可以删除around_pos值< 0或> size(mat),但这似乎不是一个非常简单的MATLAB方法。有任何想法吗?
答案 0 :(得分:5)
与讨论here相同的解决方案,但扩展到多个(任何)维度:
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{:});
重要的部分是最后四行,它避免了为每个维度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{:});
答案 1 :(得分: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)))
编辑:添加了错误陷阱。
答案 2 :(得分:0)
我发现这篇文章是因为我需要抓住Matrix中所选点的周围索引。看起来这里的答案正在返回周围值的矩阵,但问题也是对周围指数感兴趣。我能够用“try / catch”语句做到这一点,我之前在MATLAB中不知道这些语句。对于2D矩阵,Z:
%Select a node in the matrix
Current = Start_Node;
%Grab its x, y, values (these feel reversed for me...)
C_x = rem(Start_Node, length(Z));
if C_x ==0
C_x =length(Z);
end
C_y = ceil(Start_Node/length(Z));
C_C = [C_x, C_y];
%Grab the node's surrounding nodes.
try
TRY = Z(C_x - 1, C_y);
Top = Current -1;
catch
Top = Inf;
end
try
TRY = Z(C_x + 1, C_y);
Bottom = Current +1;
catch
Bottom = Inf;
end
try
TRY = Z(C_x, C_y + 1);
Right = Current + length(Z);
catch
Right = Inf;
end
try
TRY = Z(C_x, C_y - 1);
Left = Current - length(Z);
catch
Left = Inf;
end
surround = [Top, Bottom, Left, Right];
m = numel(surround == inf);
k = 1;
%Eliminate infinites.
surround(surround==inf) =[];
我希望有人发现这些信息相关。