Matlab 填补矩阵中的空白';s行
设Matlab 填补矩阵中的空白';s行,matlab,Matlab,设g为包含1\0的矩阵。我想填补g行中的0(完整的1序列)的空白,这些空白小于给定的k。 例如,用1填充所有小于3个0的间隙。此代码将在以下情况下工作: [m,n]=size(g); k=3 for i=1:m j=1 while (j<n) if(g(i,j)==0) flag=0;
g
为包含1\0的矩阵。我想填补g
行中的0(完整的1序列)的空白,这些空白小于给定的k
。
例如,用1填充所有小于3个0的间隙。此代码将在以下情况下工作:
[m,n]=size(g);
k=3
for i=1:m
j=1
while (j<n)
if(g(i,j)==0)
flag=0;
for w=1:k
if(g(i,j+w-1)==1)
flag=1;
end
end
if(flag)
for w=1:k
g(i,j+w-1)=1;
end
else
while(~flag&j<n)
j=j+1;
if(g(i,j)==1)
flag=1;
end
end
end
end
j=j+1;
end
end
[m,n]=尺寸(g);
k=3
对于i=1:m
j=1
而(jA)矢量化版本:
k = 3;
d = diff( g,1,2);
L = d ~= 0;
c = cumsum([zeros(size(g,1),1) L],2)+1;
b = bsxfun(@plus, c, cumsum([0; c(1:end-1,end)]));
a =accumarray(reshape(b.',[],1),1);
f= find(a<k);
g(ismember(b,f) & g==0) = 1;
矢量化版本:
k = 3;
d = diff( g,1,2);
L = d ~= 0;
c = cumsum([zeros(size(g,1),1) L],2)+1;
b = bsxfun(@plus, c, cumsum([0; c(1:end-1,end)]));
a =accumarray(reshape(b.',[],1),1);
f= find(a<k);
g(ismember(b,f) & g==0) = 1;
使用某些内置功能的简短版本:
M = [1 1 1 1 1
1 1 1 0 0
1 1 1 0 1
1 1 0 0 0
0 1 1 1 1]
Mopen = ~imopen(~padarray(M,[0,1],1),strel('line',3,0));
Mfill = Mopen(:,2:end-1);
使用某些内置功能的简短版本:
M = [1 1 1 1 1
1 1 1 0 0
1 1 1 0 1
1 1 0 0 0
0 1 1 1 1]
Mopen = ~imopen(~padarray(M,[0,1],1),strel('line',3,0));
Mfill = Mopen(:,2:end-1);
另一种可能的解决方案是将每一行强制转换为一个字符数组,然后基于正则表达式执行替换
g = round(rand(30,70));
figure();
subplot(121);
imagesc(g)
[m,n]=size(g);
k=3;
pattern = ['(?<!',char(0),')(',char(0),'{1,',num2str(k-1),'})(?!',char(0),')'];
for i=1:m
[matchstart,matchend] = regexp(char(g(i,:)),pattern);
for j = 1:length(matchstart)
g(i,matchstart(j):matchend(j)) = 1;
end
end
subplot(122);
imagesc(g)
g=round(兰特(30,70));
图();
小批(121);
图像SC(g)
[m,n]=尺寸(g);
k=3;
pattern=['(?另一种可能的解决方案是将每一行强制转换为一个字符数组,然后基于正则表达式执行替换
g = round(rand(30,70));
figure();
subplot(121);
imagesc(g)
[m,n]=size(g);
k=3;
pattern = ['(?<!',char(0),')(',char(0),'{1,',num2str(k-1),'})(?!',char(0),')'];
for i=1:m
[matchstart,matchend] = regexp(char(g(i,:)),pattern);
for j = 1:length(matchstart)
g(i,matchstart(j):matchend(j)) = 1;
end
end
subplot(122);
imagesc(g)
g=round(兰特(30,70));
图();
小批(121);
图像SC(g)
[m,n]=尺寸(g);
k=3;
pattern=['(?如何定义“间隙”?向我们展示一个您期望的示例,也许向我们展示您的for循环实现,我们可以提供帮助。我无法运行您的程序!您如何定义“间隙”?向我们展示一个您期望的示例,也许向我们展示您的for循环实现,我们可以提供帮助。我无法运行您的程序!