В этом примере показано, как минимизировать избыточные операции в контурах. Если операция цикла не зависит от индекса цикла, ее выполнение внутри цикла является избыточным. Эта избыточность часто остается незамеченной при выполнении нескольких операций в одной инструкции MATLAB ® внутри цикла. Например, в следующем коде инверсия матрицыB вычисляется 100 раз внутри цикла, хотя и не зависит от индекса цикла:
for i=1:100
C=C + inv(B)*A^i*B;
end
Выполнение таких операций с резервированным контуром может привести к ненужной обработке. Чтобы избежать ненужной обработки, перемещайте операции за пределы циклов, пока они не зависят от индекса цикла.
Определите функцию, SeriesFunc(A,B,n), которая вычисляет сумму n термины в следующем расширении серии питания:
− 1A2B +...
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 только один раз, что приводит к более быстрому выполнению сгенерированного кода.