Этот пример показывает, как минимизировать избыточные операции в циклах. Когда операция цикла не зависит от индекса цикла, выполнение его в цикле избыточно. Это сокращение часто остается незамеченным, когда вы выполняете несколько операций в одном операторе 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
только однажды, ведя к более быстрому выполнению сгенерированного кода.