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;

调试输入输出 -