2016-12-16 89 views
0

g为包含ones \ zeroes的矩阵。我想填充g行中零的间隙(完整序列),这些行比规定的k小。例如,填充所有小于三个零的空位。此代码将工作:填充矩阵行中的间隙

 [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 

有没有办法做到这一点,没有所有的for循环?

+4

你如何定义“差距”?向我们展示您期望的例子,并向我们展示您的循环实施,我们可以提供帮助。 – Suever

+0

我无法运行您的程序! – rahnema1

回答

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; 

实施例:

g = 

    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 

result = 

    1 1 1 1 1 
    1 1 1 1 1 
    1 1 1 1 1 
    1 1 0 0 0 
    1 1 1 1 1 
3

使用一些内置的功能的短版:

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); 
0

另一个潜在的解决方案是每一行转换为一个字符数组,然后执行基于正则表达式的替换

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)