填补矩阵行中的空白

时间:2016-12-16 14:41:56

标签: matlab

g成为包含1 \ neroes的矩阵。我想在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循环的情况下这样做?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

答案 2 :(得分:0)

另一个可能的解决方案是将每一行转换为char数组,然后根据正则表达式执行替换

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)