如何在matlab中提高for循环的速度?

时间:2013-07-22 14:09:37

标签: matlab

我想在图像结果中读取pixcels的值,以便将此值与某些值进行比较 我用来循环

function GrdImg= GrdLbp(VarImg,mapping,LbpImg)
tic
p=mapping.samples;
[Ysize,Xsize]=size(result);
GImg=zeros(Ysize,Xsize);
temp=[];
cnt=1;
for n=0:p-1
    temp(cnt)=2^n;
    temp(cnt+1)=(2^p)-1-(2^n);
    cnt=cnt+2;
end
for i=1:Ysize
    i
        for j=1:Xsize
                if isempty(find(result(i,j)==temp(:,:)))==1
                  GImg(i,j)=sqrtm(Vresult(i,j));
                end


            end
        end 

但是效果太慢了,你能帮助我,我可以用什么而不是循环? 非常感谢

3 个答案:

答案 0 :(得分:6)

你没有提供足够的信息来回答你的问题 - 因为正如评论中所述,你现在没有对循环中的值做任何事情。那么,让我给你一些想法:

1)比较具有固定值的所有像素,并返回大于最大值的90%的所有像素的索引:

threshold = 0.9 * max(myImage(:));
prettyBigPixels = find(myImage > threshold);

2)设置所有像素<最大值为零的5%:

threshold = 0.05 * max(myImage(:));
myImage(myImage < threshold) = 0;

在第一种情况下,find命令返回所有索引(注意 - 您可以访问具有从1到M * N的单个索引的MxN的2D矩阵)。如果您愿意,可以使用ind2sub转换为单独的i, j系数。

在第二种情况下,将(myImage < threshold)作为矩阵的索引称为逻辑索引 - 它非常快,并且只能访问那些符合标准的元素。

如果你让我们知道你所发现的价值,我们可以加快速度;因为现在,你的代码的最终结果是当循环结束时,你的值Temp等于最后一个元素 - 并且由于你在循环中什么也没做,我们可以把整个事情重写为

Temp = pixel(end);

编辑既然您已经在内循环中展示了自己在做什么,我们就可以进行更多优化。 Behzad已经展示了如何加速向量temp的计算 - 没有什么可以添加的,这是正确的方法。至于两个嵌套循环,可能是花费大部分时间的地方,你可以用一行找到你感兴趣的所有像素:

pixelsOfInterest = find(~ismember(result(:), temp(:)));

这将在result中找到temp中未出现的像素索引。然后你可以做

GImg(pixelsOfInterest) = sqrt(result(pixelsOfInterest));

这两行应该替换代码中从for i=1:Ysize到最后end的所有功能。注意 - 您的变量似乎未初始化,并且更改了名称 - 有时它是result,有时它是Vresult。我不是想调试那个;只是让你快速实现你的内循环。

答案 1 :(得分:0)

您的图像似乎是灰色或单色,因为Temp=pixel(i,j)提供的数字不是3个数字。

你的问题没有更多解释,所以我认为你要与三种类型的数字进行比较。

  1. 与常数比较
  2. 与一系列数字进行比较
  3. 与二维数字矩阵比较
  4. 如果您需要第一个或第三个,解决方案非常简单(绝对在第三个,矩阵的大小必须等于pixel大小)

    • 与数字进行比较(c是数字或二维数组)

      comp=pixel - c;
      

      但如果第二个是您的需要,您可以先将pixel重新塑造为一维矩阵,然后将其与数字s系列进行比较(此系列的绝对长度必须等于pixel行数和列号;您可以在与主要二维矩阵比较后重新整形pixel矩阵。

    • 与系列s

      进行比较
      pixel_temp = reshape(pixel,1,[]);
      comp = pixel_temp - s;
      pixel_compared = reshape(pixel_temp,size(pixel,1),size(pixel,2));  % to re-reshape to primary size
      

答案 2 :(得分:0)

至于完全编辑的问题我顺便回答新的而不是编辑我以前的答案。

您可以通过以下方式改进代码:
 1.而不是:
    

    for n=0:p-1
        temp(cnt)=2^n;
        temp(cnt+1)=(2^p)-1-(2^n);
        cnt=cnt+2;
    end
    
使用这个:     
    temp=zeros(1,2*p);
    n=0:p-1;
    temp(1:2:2*p)=2.^n; %//for odd elements 
    temp(2:2:2*p)=2^p-1-2.^n; %//for even elements (i supposed p>1) 

2.当代码准备好计算而不用于调试或其他时间时,不要在屏幕上打印一些变量,因为它会花费太长的时间(在cpu循环中)运行。在您的代码中,有一些变量如i在屏幕上打印。移除它们或通过;结束它们。


3.您可以在最后一行使用temp(:),因为temp是一维的
4.不同的功能适用于不同类型的变量。在此代码中,您可以使用sqrt()代替sqrtm()。它可能会稍快一点
5。这段代码中的一个大问题是在你的最后一次比较中,如果temp矩阵的非元素与result特定元素不相等,那么就做一些事情!除非知道代码的真正目的,否则很难改进这部分!您可能会在其他具有完全不同代码的算法中解决问题。但如果没有办法,那么以这种方式使用它(嵌套循环)祝你好运!