如何在以下MATLAB代码中删除for循环?

时间:2014-06-23 04:48:53

标签: performance matlab image-processing for-loop time

我需要在图像处理项目中执行以下计算。它是H3总和的对数。我编写了以下代码,但这个循环的计算时间非常长。有没有办法消除for循环?

    for k=1:i
        for l=1:j
            HA(i,j)=HA(i,j)+log2((H3(k,l)/probA).^q);
        end;
    end;

提前致谢!

编辑:

for i=1:256
for j=1:240

    probA = 0;
    probC = 0;

    subProbA = H3(1:i,1:j);
    probA = sum(subProbA(:));

    probC = 1-probA;    

    for k=1:i
        for l=1:j
            HA(i,j)=HA(i,j)+log2((H3(k,l)/probA).^q);
        end;
    end;

    HA(i,j)=HA(i,j)/(1-q);

    for k=i+1:256
        for l=j+1:240
            HC(i,j)=HC(i,j)+log2((H3(k,l)/probC).^q);
        end;
    end;

    HC(i,j)=HC(i,j)/(1-q);


    e1(i,j) = HA(i,j) + HC(i,j); 
    if e1(i) >= emax
        emax = e1(i);
        tt1 = i-1;
    end;
end;
end;

2 个答案:

答案 0 :(得分:0)

假设两个循环嵌套在使用ij迭代的其他外部循环中(尽管使用ij,因为迭代器不是最佳实践并且假设probAq是标量,请尝试这个 -

HA(i,j) = sum(sum(log2((H3(1:i,1:j)./probA).^q)))

使用上面的代码片段,yon可以用这个替换你在EDIT部分发布的实际代码 -

for i=1:256
    for j=1:240

        subProbA = H3(1:i,1:j);
        probA = sum(subProbA(:));
        probC = 1-probA;

        HA(i,j) = sum(sum(log2((subProbA./probA).^q)))./(1-q);        
        HC(i,j) = sum(sum(log2((subProbA./probC).^q)))./(1-q);

        e1(i,j) = HA(i,j) + HC(i,j);
        if e1(i) >= emax
            emax = e1(i);
            tt1 = i-1;
        end
    end
end

请注意,在此代码中,probA = 0;probC = 0;会被删除,因为它们会在以后的原始代码中被覆盖。

答案 1 :(得分:0)

假设q是标量值,此代码将删除所有四个for循环。同样在您给定的代码中,您只在第一列计算e1的最大值。如果是这样,那么你应该放出第二个循环

height = 256;
width = 240;
a = repmat((1:height)',1,width);
b = repmat(1:width,height,1);
probA = arrayfun(@(ii,jj)(sum(sum(H3(1:ii,1:jj)))),a,repmat(1:width,height,1));
probC = 1 - probA;
HA = arrayfun(@(ii,jj)(sum(sum(log2((H3(1:ii,1:jj)/probA(ii,jj)).^q)))/(1-q)),a,b);
HC = arrayfun(@(ii,jj)(sum(sum(log2((H3(ii+1:height,jj+1:width)/probC(ii,jj)).^q)))/(1-q)),a,b);
e1 = HA + HC;
[emax tt_temp] = max(e1(:,1));
tt1 = tt_temp - 1;
相关问题