我有一个逻辑矩阵A,我想选择给定固定距离的每个1s值左边的所有元素。让我们说我的距离是4,我想(例如)用固定值(说2)替换A中每个1左边的所有4个单元格。
A= [0 0 0 0 0 1 0
0 1 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 1 0 1]
B= [0 2 2 2 2 1 0
2 1 0 0 0 0 0
0 0 0 0 0 0 0
2 2 2 2 2 2 1]
在B中是我想要的,考虑到也是过度的(B中的最后一行),以及在我的1左边只有1个值而不是4作为固定搜索距离(第二行)的情况。
答案 0 :(得分:8)
这个可爱的单行怎么样?
n = 3;
const = 5;
A = [0 0 0 0 0 1 0;
0 1 0 0 0 0 0;
0 0 0 0 0 0 0;
0 0 0 0 1 0 1]
A(bsxfun(@ne,fliplr(filter(ones(1,1+n),1,fliplr(A),[],2)),A)) = const
结果:
A =
0 0 5 5 5 1 0
5 1 0 0 0 0 0
0 0 0 0 0 0 0
0 5 5 5 5 5 1
这里有一些解释:
Am = fliplr(A); %// mirrored input required
Bm = filter(ones(1,1+n),1,Am,[],2); %// moving average filter for 2nd dimension
B = fliplr(Bm); %// back mirrored
mask = bsxfun(@ne,B,A) %// mask for constants
A(mask) = const
答案 1 :(得分:3)
以下是您可以提出的简单解决方案:
w=4; % Window size
v=2; % Desired value
B = A;
for r=1:size(A,1) % Go over all rows
for c=2:size(A,2) % Go over all columns
if A(r,c)==1 % If we encounter a 1
B(r,max(1,c-w):c-1)=v; % Set the four spots before this point to your value (if possible)
end
end
end
答案 2 :(得分:2)
d = 4; %// distance
v = 2; %// value
A = fliplr(A).'; %'// flip matrix, and transpose to work along rows.
ind = logical( cumsum(A) ...
- [ zeros(size(A,1)-d+2,size(A,2)); cumsum(A(1:end-d-1,:)) ] - A );
A(ind) = v;
A = fliplr(A.');
结果:
A =
0 2 2 2 2 1 0
2 1 0 0 0 0 0
0 0 0 0 0 0 0
2 2 2 2 2 2 1
答案 3 :(得分:2)
方法#1 使用图像处理工具箱提供的 imdilate
一行 -
A(imdilate(A,[ones(1,4) zeros(1,4+1)])==1)=2
<强>解释强>
步骤1:创建一个与imdilate
一起使用的形态结构元素 -
morph_strel = [ones(1,4) zeros(1,4+1)]
这基本上代表一个窗口向左延伸n
个位置,右边有1个n位,包括带零的原点。
第2步:使用imdilate
修改A
,以便我们在{{1}左侧的所有四个位置1
1
在A
-
imdilate_result = imdilate(A,morph_strel)
步骤3:为1
的每个A
选择所有四个索引并将其设置为2
-
A(imdilate_result==1)=2
因此,可以将此方法的一般形式写为 -
A(imdilate(A,[ones(1,window_length) zeros(1,window_length+1)])==1)=new_value
对于给定数据,window_length
为4
,new_value
为2
。
方法#2 使用 bsxfun
-
%// Paramters
window_length = 4;
new_value = 2;
B = A' %//'
[r,c] = find(B)
extents = bsxfun(@plus,r,-window_length:-1)
valid_ind1 = extents>0
jump_factor = (c-1)*size(B,1)
extents_valid = extents.*valid_ind1
B(nonzeros(bsxfun(@plus,extents_valid,jump_factor).*valid_ind1))=new_value
B = B' %// B is the desired output