Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Performance 如何在下面的MATLAB代码中删除for循环?_Performance_Matlab_Image Processing_For Loop_Time - Fatal编程技术网

Performance 如何在下面的MATLAB代码中删除for循环?

Performance 如何在下面的MATLAB代码中删除for循环?,performance,matlab,image-processing,for-loop,time,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; 提前谢谢 编辑: 假设这两个循环嵌套在使用i和j迭代的其他外部循环中(尽管使用i和j作为迭代器不是最佳做法),并且假设probA和q是标量,尝试

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

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

编辑:


假设这两个循环嵌套在使用
i
j
迭代的其他外部循环中(尽管使用
i
j
作为迭代器不是最佳做法),并且假设
probA
q
是标量,尝试以下方法-

HA(i,j) = sum(sum(log2((H3(1:i,1:j)./probA).^q)))
使用上面的代码片段,您可以用以下代码替换您在编辑部分发布的实际代码-

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将被删除,因为它们在原始代码的后面被重写。

假设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;

你需要触摸图像中的每个像素吗?如果你这样做,你将需要两个循环无论如何。。。一个用于x轴,一个用于y轴。是的,我需要访问所有像素。您是使用I和j访问所有像素,还是使用k和l访问所有像素?
probA
q
的大小是多少?您不是将这两个循环嵌套到另外两个外部循环中,并使用
i
j
作为迭代器吗?看起来是这样,i和j是强度值。k和l用于访问H3中的所有像素。实际上是两幅图像的联合直方图。probA和q是常量。由于您不知道
H3
的大小,我认为它应该是
HA(i,j)=sum(sum(log2((H3(1:i,1:j)。/probA)。^q))
@Nishant谢谢,这确实是个bug!固定的。
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;