代码之家  ›  专栏  ›  技术社区  ›  Gacek

Matlab中的矢量化循环-性能问题

  •  1
  • Gacek  · 技术社区  · 16 年前


    Introduction to vectorizing in MATLAB - any good tutorials?
    filter that uses elements from two arrays at the same time

    根据我读到的教程,我试图将一些过程矢量化,这需要很多时间。

    我重写了这个:

    function B = bfltGray(A,w,sigma_r)
    dim = size(A);
    B = zeros(dim);
    for i = 1:dim(1)
        for j = 1:dim(2)
    
            % Extract local region.
            iMin = max(i-w,1);
            iMax = min(i+w,dim(1));
            jMin = max(j-w,1);
            jMax = min(j+w,dim(2));
            I = A(iMin:iMax,jMin:jMax);
    
            % Compute Gaussian intensity weights.
            F = exp(-0.5*(abs(I-A(i,j))/sigma_r).^2);
            B(i,j) = sum(F(:).*I(:))/sum(F(:));
    
        end
    end
    

    进入这个:

    function B = rngVect(A, w, sigma)
    W = 2*w+1;
    I = padarray(A, [w,w],'symmetric');
    I = im2col(I, [W,W]);
    H = exp(-0.5*(abs(I-repmat(A(:)', size(I,1),1))/sigma).^2);
    B = reshape(sum(H.*I,1)./sum(H,1), size(A, 1), []);
    

    在哪里?
    A 是矩阵512x512
    w 是窗口大小的一半,通常等于5
    sigma
    所以 I 矩阵将有512x512x121=31719424个元素

    但是这个版本看起来和第一个版本一样慢,但是另外它使用了大量的内存,有时会导致内存问题。

    我还尝试使用nlfilter(类似于 second solution given by Jonas )但自从我使用 (R13)(没有复杂的功能句柄可用)。

    所以,我再次要求的不是现成的解决方案,而是一些能帮助我在合理时间内解决这个问题的想法。也许你会指出我做错了什么。

    编辑:
    正如米哈伊尔所建议的,剖面分析的结果如下:
    65%的时间花在排队上 H= exp(...)
    25%的时间用于 im2col

    1 回复  |  直到 9 年前
        1
  •  1
  •   Jonas    16 年前

    我和H有多大。 numel(I)*8 字节)?如果开始分页,那么第二个解决方案的性能将受到非常严重的影响。

    若要测试是否确实存在由于数组太大而导致的问题,可以尝试使用 tic toc 对于数组 A 越来越大。如果执行时间的增长速度大于A大小的平方,或者如果执行时间以 ,你可以试着把垫子分开 I

    否则,我看不到任何明显的地方,你可能会失去很多时间。好吧,也许你可以跳过整形,换个 B 具有 在你的函数中(也节省了一点内存),并且 A(:) = sum(H.*I,1)./sum(H,1);

    你可能还想看看升级到最新版本的Matlab——他们已经在提高性能上下了很大功夫。