MATLAB 根据周围数据将元素更改为零
MATLAB change elements to zero based on surrounding data
只是一个矩阵问题,可能很简单,但我想不出来。假设我有一个 20 x 20 矩阵 A。我有另一个大小相同但合乎逻辑的矩阵 B。我想将 A 中位置在 B 中“1”的 3 个范围内(比如)的任何元素更改为 0。
詹姆斯
图像处理工具箱包含一个函数imdilate
,可以将B
附近1
的位置也填充为1
。然后我们只对 A
使用逻辑索引。您提到的距离是使用欧氏距离计算的。如果您想要棋盘距离,请改用 neighborhood = ones(2*R+1)
。
R = 3;
[X,Y] = ndgrid(-ceil(R):ceil(R));
neighborhood = (X.^2 + Y.^2)<=R^2;
A(imdilate(B,neighborhood)) = 0;
代码
基于bsxfun
解决此类问题的方法-
%// Form random A and B for demo purposes
N = 50; %// input datasize
A = rand(N);
B = rand(N)>0.9;
R = 2; %// neighbourhood radius
%// Find linear indices offsets within 2R*2R neighbourhood
offset_displacement = bsxfun(@plus,(-R:R)',[-R:R]*size(A,1)); %//'
offset_matches = bsxfun(@plus,(-R:R)'.^2,[-R:R].^2) <= R*R; %//'
offset_matched_displacement = offset_displacement(offset_matches);
%// Use those offsets to find actual linear indices for all '1' points in B
loc = bsxfun(@plus,find(B),offset_matched_displacement'); %//'
%// Set "eligible" points (based on loc) to zeros in A
A(loc(loc>=1 & loc<=numel(A)))=0;
调试输入输出 -
只是一个矩阵问题,可能很简单,但我想不出来。假设我有一个 20 x 20 矩阵 A。我有另一个大小相同但合乎逻辑的矩阵 B。我想将 A 中位置在 B 中“1”的 3 个范围内(比如)的任何元素更改为 0。
詹姆斯
图像处理工具箱包含一个函数imdilate
,可以将B
附近1
的位置也填充为1
。然后我们只对 A
使用逻辑索引。您提到的距离是使用欧氏距离计算的。如果您想要棋盘距离,请改用 neighborhood = ones(2*R+1)
。
R = 3;
[X,Y] = ndgrid(-ceil(R):ceil(R));
neighborhood = (X.^2 + Y.^2)<=R^2;
A(imdilate(B,neighborhood)) = 0;
代码
基于bsxfun
解决此类问题的方法-
%// Form random A and B for demo purposes
N = 50; %// input datasize
A = rand(N);
B = rand(N)>0.9;
R = 2; %// neighbourhood radius
%// Find linear indices offsets within 2R*2R neighbourhood
offset_displacement = bsxfun(@plus,(-R:R)',[-R:R]*size(A,1)); %//'
offset_matches = bsxfun(@plus,(-R:R)'.^2,[-R:R].^2) <= R*R; %//'
offset_matched_displacement = offset_displacement(offset_matches);
%// Use those offsets to find actual linear indices for all '1' points in B
loc = bsxfun(@plus,find(B),offset_matched_displacement'); %//'
%// Set "eligible" points (based on loc) to zeros in A
A(loc(loc>=1 & loc<=numel(A)))=0;
调试输入输出 -