Этот пример показывает, как минимизировать избыточные операции в циклах. Когда операция цикла не зависит от индекса цикла, выполнение ее внутри цикла избыточно. Эта избыточность часто остается незамеченной, когда вы выполняете несколько операций в одном MATLAB® оператор внутри цикла. Для примера в следующем коде обратная матрица B
вычисляется 100 раз внутри цикла, хотя это не зависит от индекса цикла:
for i=1:100 C=C + inv(B)*A^i*B; end
Выполнение таких операций избыточного цикла может привести к ненужной обработке. Чтобы избежать ненужной обработки, перемещайте операции за пределы циклов, пока они не зависят от индекса цикла.
Задайте функцию, SeriesFunc(A,B,n)
, который вычисляет сумму n
термины в следующем расширении степени серии:
function C=SeriesFunc(A,B,n) % Initialize C with a matrix having same dimensions as A C=zeros(size(A)); % Perform the series sum for i=1:n C=C+inv(B)*A^i*B; end
Сгенерируйте код для SeriesFunc
с матрицами 4 на 4, переданными как входные параметры для A
и B
:
X = coder.typeof(zeros(4)); codegen -config:lib -launchreport SeriesFunc -args {X,X,10}
В сгенерированном коде инверсия B
выполняется n
раз внутри цикла. Более экономично выполнить операцию инверсии один раз вне цикла, потому что она не зависит от индекса цикла.
Изменение SeriesFunc
следующим образом:
function C=SeriesFunc(A,B,n) % Initialize C with a matrix having same dimensions as A C=zeros(size(A)); % Perform the inversion outside the loop inv_B=inv(B); % Perform the series sum for i=1:n C=C+inv_B*A^i*B; end
Эта процедура выполняет инверсию B
только один раз, что приводит к более быстрому выполнению сгенерированного кода.