matlab 在本例中避免For循环的方法

waxmsbnn  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(201)

我正在寻找一种方法来避免我的代码中的for循环,以保持较短的计算时间。

k = rand(15,15)
v= rand(6,15)

for i=1:6
   C(i) = v(i, :) * k * v(i, :)'
end

在这个例子中有这样的可能性吗,不幸的是,我想不出任何东西。在实际的程序中,v不会只有6行,而是数千行。

jvlzgdj9

jvlzgdj91#

下面的内容将会给您带来相同的结果。对于中等大小的阵列(大约1.5k),这比for循环快15倍。

k = rand(15,15)
v = rand(6,15)
C = diag(v(1:6,:) * k * v(1:6,:)')'

@adriaan建议的一个小基准测试表明,g()的速度是原来的17倍:

k = rand(1500,1500);
v = rand(1000,1500);

f = @() fun(k,v);
g = @() diag(v(1:600,:) * k * v(1:600,:)')';
timeit(f)  % Time: 0.5122
timeit(g)  % Time: 0.0332

function C = fun(k,v)
    C = zeros(1,600);
    for i = 1:600
        C(i) = v(i, :) * k * v(i, :)';
    end
end

这里应该明确的是,for循环不是罪魁祸首,而是向量矩阵与矩阵矩阵运算的底层BLAS实现;后者在MKL中得到了高度优化。

相关问题