Удалить циклы из кода?


Можно ли удалить все циклы из следующего кода и вычислить значения 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 2

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]) - может быть, порядок не совсем тот же.

Здесь можно использовать простой 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(:).';