2016-12-16 98 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)