从代码中删除循环?

时间:2014-10-29 19:38:06

标签: vectorization matlab

是否可以从以下代码中删除所有循环,并使用向量计算k值。

index = 0;
for i = 1.1:0.1:2.5
    for j = 200:300:3000
        for z = 1:14:14000
            index = index + 1;
            k(index) = (log(i) *pi/(sqrt(j)))* exp(z);
        end
    end
end

2 个答案:

答案 0 :(得分:2)

像这样的东西

[I, J, Z] = meshgrid(1.1 : 0.1 : 2.5, 200 : 300 : 3000, 1 : 14 : 14000);
k = log(I) .* pi ./ sqrt(J) .* exp(Z);
k = reshape(permute(k, [3 2 1]), 1, []);

ps:你确定范围吗? exp(14000)无法以常规精度计算。 并检查此步骤permute(k, [3 2 1]) - 订单可能不完全相同。

答案 1 :(得分:1)

你可以在这里使用简单的matrix multiplication,这必须快速有效,因为在MATLAB -

上没有什么胜过矩阵乘法
array1 = 1.1:0.1:2.5;
array2 = 200:300:3000;
array3 = 1:14:14000;

mult1 = (log(array1).')*(pi./(sqrt(array2))); %//'
mult2 = mult1(:)*exp(array3);
out = mult2(:).';