在MATLAB中'for'循环与矢量化

lor*_*ord 8 performance matlab for-loop vectorization

我在MATLAB中编程,并且按照建议,我总是尝试使用矢量化.但最终该计划相当缓慢.所以我发现在一个地方使用循环时代码明显更快(例如下面的例子).

我想知道我是否误解了某些内容或做错了什么,因为在这种情况下性能很重要,而且我不想继续猜测矢量化或循环是否会更快.

% data initialization

k = 8;
n = 2^k+1;
h = 1/(n-1);
cw = 0.1;

iter = 10000;

uloc = zeros(n);
fploc = uloc;
uloc(2:end-1,2:end-1) = 1;
vloc = uloc;
ploc = ones(n);

uloc2 = zeros(n);
fploc2 = uloc2;
uloc2(2:end-1,2:end-1) = 1;
vloc2 = uloc2;
ploc2 = ones(n);

%%%%%%%%%%%%%%%%%%%%%%
% vectorized version %
%%%%%%%%%%%%%%%%%%%%%%
tic
for it=1:iter
    il=2:4;
    jl=2:4;
    fploc(il,jl) = h/6*(-uloc(il-1,jl-1) + uloc(il-1,jl)...
        -2*uloc(il,jl-1)+2*uloc(il,jl+1)...
        -uloc(il+1,jl) + uloc(il+1,jl+1)...
        ...
        -vloc(il-1,jl-1) - 2*vloc(il-1,jl)...
        +vloc(il,jl-1) - vloc(il,jl+1)...
        + 2*vloc(il+1,jl) + vloc(il+1,jl+1))...
        ...
        +cw*h^2*(-ploc(il-1,jl)-ploc(il,jl-1)+4*ploc(il,jl)...
        -ploc(il+1,jl)-ploc(il,jl+1));
end
toc


%%%%%%%%%%%%%%%%%%%%%%
%    loop version    %
%%%%%%%%%%%%%%%%%%%%%%
tic
for it=1:iter
    for il=2:4
        for jl=2:4
            fploc2(il,jl) = h/6*(-uloc2(il-1,jl-1) + uloc2(il-1,jl)...
                -2*uloc2(il,jl-1)+2*uloc2(il,jl+1)...
                -uloc2(il+1,jl) + uloc2(il+1,jl+1)...
                ...
                -vloc2(il-1,jl-1) - 2*vloc2(il-1,jl)...
                +vloc2(il,jl-1) - vloc2(il,jl+1)...
                + 2*vloc2(il+1,jl) + vloc2(il+1,jl+1))...
                ...
                +cw*h^2*(-ploc2(il-1,jl)-ploc2(il,jl-1)+4*ploc2(il,jl)...
                -ploc2(il+1,jl)-ploc2(il,jl+1));
        end
    end
end
toc
Run Code Online (Sandbox Code Playgroud)

Mat*_*ter 6

我没有查看你的代码,但最近版本的Matlab中的JIT编译器已经改进到你所面临的情况非常普遍 - 循环可以比矢量化代码更快.事先很难知道哪个会更快,所以最好的方法是以最自然的方式编写代码,对其进行分析,然后如果存在瓶颈,尝试从循环切换到矢量化(或其他方式).


mem*_*elf 6

MATLAB的即时编译器(JIT)在过去几年中得到了显着改善.即使你是对的,通常也应该对代码进行矢量化,根据我的经验,这仅适用于某些操作和函数,还取决于函数处理的数据量.

找到最佳方法的最佳方法是使用和不使用矢量化来分析MATLAB代码.