Наибольшая стоимость в вашем первом цикле на самом деле связана с динамическим изменением размера массива tester
. Каждый раз в цикле Matlab должен копировать существующий массив в новое место в памяти с местом для дополнительного элемента. Итак, это операция O (n) для каждой итерации цикла. Если вы предварительно выделите массив, он будет работать намного быстрее, например,
tic
tester = zeros(100000,1);
for tind = 1:length(t)
tester(tind) = cos(2*pi*fd*t(tind))/(2*pi*fd.*t(tind));
end
toc
В моей системе я получаю 11,3 секунды для исходного цикла, 0,0013 секунды для векторизованной версии и 0,010 секунды для цикла с памятью для предварительно выделенного tester
.
Стоит отметить, что многие другие языки с массивами с изменяемыми размерами выделяют дополнительное пространство в блоках, пропорционально текущему размеру массива, поэтому стоимость создания массива путем добавления одного элемента за раз составляет всего O (n log n), так что это особый недостаток Matlab.