И другие программы этой серии
О повышении скорости вычислений в старых версиях MATLAB
В литературе по устаревшим версиям системы MATLAB отмечаются факты резкого ускорения выполнения матричных операций при переходе от обычных арифметических операций с элементами матриц (например, +, –, *, /, ^) к «параллельным» поэлементным операциям (например, .+, .–, .*, ./, .^). Постараемся прояснить этот вопрос применительно к использованию новых версий системы MATLAB.
4.5.2. Ситуация со скоростью вычислений в MATLAB 7.*
В новых реализациях MATLAB благодаря применению ускорителя времени исполнения (JIT) такое увеличение стало мифическим. Покажем это на примере выполнения операции поэлементного возведения элемента матрицы A в степень элемента матрицы B, используя для этого следующие m-файлы (программы):
Файл test2
A=rand(1000,1000); B=rand(1000,1000); A=A.AB
Файл test1 A=rand(1000,1000); B=rand(1000,1000); for i=1:1000
for j=1:1000
A(i,j)=A(i,j)^B(i,j);
end end
В этих примерах используются матрицы A и B со случайными значениями элементов, имеющие размер 1000×1000, то есть в примерах выполняется миллион операций возведения в степень. Для вычисления затрат процессорного времени можно использовать конструкцию tic,…,toc, на место многоточия которой помещается команда или группа команд, время вычисления которых нужно измерить. Для наших примеров:
A
1
t
f
232
Операции с векторами и матрицами
>> clear all
>> tic, test1, toc
Elapsed time is 1.062000 seconds.
>> clear all
>> tic, test2, toc
Elapsed time is 0.891000 seconds.
Результат в особых комментариях не нуждается – время вычисления для обоих примеров различается всего 16%.
Возьмем еще пару примеров – на этот раз на операцию деления каждого элемента квадратной матрицы A на величину i*j во вложенном цикле:
Файл test4
A=rand(1000,1000);
row=[1:1000]
A=A./(row’*row)
Файл test3 A=rand(1000,1000); for i=1:1000
for j=1:1000
A(i,j)=A(i,j)/(i*j);
end end
Результаты исполнения этих тестов оказались вообще одинаковыми:
>> clear all
>> tic, test3, toc
Elapsed time is 0.157000 seconds.
>> clear all
>> tic, test4, toc
Elapsed time is 0.157000 seconds.
Можно также отметить, что практически теряет значения и предварительное задание под большие матрицы памяти в ОЗУ.
Начало в части 1