Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 填补矩阵中的空白';s行_Matlab - Fatal编程技术网

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循环实现,我们可以提供帮助。我无法运行您的程序!