exponenta event banner

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

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

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

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

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

    C = 1 + B 1AB + B − 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
    
  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 только один раз, что приводит к более быстрому выполнению сгенерированного кода.