我需要在图像处理项目中执行以下计算。它是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;
答案 0 :(得分:0)
假设两个循环嵌套在使用i
和j
迭代的其他外部循环中(尽管使用i
和j
,因为迭代器不是最佳实践并且假设probA
和q
是标量,请尝试这个 -
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;