Минимизация избыточных операций в циклах

Этот пример показывает, как минимизировать избыточные операции в циклах. Когда операция цикла не зависит от индекса цикла, выполнение ее внутри цикла избыточно. Эта избыточность часто остается незамеченной, когда вы выполняете несколько операций в одном MATLAB® оператор внутри цикла. Для примера в следующем коде обратная матрица B вычисляется 100 раз внутри цикла, хотя это не зависит от индекса цикла:

for i=1:100
     C=C + inv(B)*A^i*B;
  end

Выполнение таких операций избыточного цикла может привести к ненужной обработке. Чтобы избежать ненужной обработки, перемещайте операции за пределы циклов, пока они не зависят от индекса цикла.

  1. Задайте функцию, SeriesFunc(A,B,n), который вычисляет сумму n термины в следующем расширении степени серии:

    C=1+B1AB+B1A2B+...

      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
    
  2. Сгенерируйте код для SeriesFunc с матрицами 4 на 4, переданными как входные параметры для A и B:

    X = coder.typeof(zeros(4));
    codegen -config:lib -launchreport SeriesFunc -args {X,X,10}

    В сгенерированном коде инверсия B выполняется n раз внутри цикла. Более экономично выполнить операцию инверсии один раз вне цикла, потому что она не зависит от индекса цикла.

  3. Изменение 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 только один раз, что приводит к более быстрому выполнению сгенерированного кода.