В моей программе мне нужно рассчитать сумму:Возможно ли сделать этот векторизованный код MATLAB быстрее?
.
Рассчитать эту сумму 2500 раз с новыми значениями C
и z
.
Аргумент z может быть вектором. Я написал простым для цикла и векторизованного версии кода следующим образом:
K = 200;
n_z = 40000;
C = ones(K,1); % an example, in real life the arey some coefficients (at next call will be new)
k = 0:K-1;
z = linspace(0, 2*pi, n_z); % at next call will be new
tic;
my_sum_for = zeros(1, K);
for i=1:n_z
my_sum_for(i) = C' * tan(k' * z(i));
end
toc; % Elapsed time is 1.820485 seconds.
tic;
my_sum = C' * tan(k' * z);
toc; % Elapsed time is 0.160924 seconds.
Векторизованной версия работает быстрее, но не достаточно. Можно ли улучшить векторную версию?
После ответа Доминик Jacquel, я есть эта векторизованную версия, это быстрее:
K = 200;
n_z = 40000;
C = ones(K,1)'; % an example, in real life they are some coefficients (at next call will be new)
k = (0:K-1)';
z = linspace(0, 2*pi, n_z); % at next call will be new
tic;
my_sum_for = zeros(1, K);
for i=1:n_z
my_sum_for(i) = C * tan(k * z(i));
end
toc; % Elapsed time is 1.521587 seconds.
tic;
my_sum = C * tan(k * z);
toc; % Elapsed time is 0.125468 seconds.
Можно ли улучшить векторизованную версию еще больше (bsxfun, arrayfun или что-то)? Время 250 секунд для меня все еще медленное (это 75% всех вычислений).
'all (my_sum_for == my_sum) -> ans = 0' ... так что вы этого не сделали? Мне кажется, что вы делаете какую-то странную перестановку, которая не нужна .., –
Я проверил это, вычислив норму (my_sum_for, my_sum) = 1.7861e-10. Для меня не ново, что векторизованные и зацикленные версии одного и того же кода дают несколько разные результаты. – N0rbert
Является ли фактическое содержание 'C' действительно только одними? И в матрице 'k * z' есть несколько повторяющихся элементов, которые вы могли бы пропустить вычисление' tan' of, но с учетом значений 'K' и' n_Z' там не так много денег. –