Повторно используйте ту же переменную с другими свойствами

Когда вы можете повторно использовать ту же переменную с различными свойствами

Можно повторно использовать (переназначить) вход, вывод или локальную переменную с разным классом, размером или сложностью, если генератор кода может однозначно определить свойства каждого вхождения этой переменной во время генерации кода C/C + +. Если это так, MATLAB® создает отдельные однозначно именованные локальные переменные в сгенерированном коде. Эти переименованные переменные можно просмотреть в отчете генерации кода.

Общий пример повторного использования переменной в if-elseif-else или switch-case операторы. Например, следующая функция example1 сначала использует t переменной в if оператор, где содержит скаляр double, затем повторно использует t вне if оператор для хранения вектора двойных чисел.

function y = example1(u) %#codegen
if all(all(u>0))
    % First, t is used to hold a scalar double value
    t = mean(mean(u)) / numel(u);
    u = u - t;
end
% t is reused to hold a vector of doubles
t = find(u > 0);
y = sum(u(t(2:end-1)));

Когда вы не можете повторно использовать переменные

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

Для примера выполните следующее example2 функция присваивает значение с фиксированной точкой, чтобы x в if оператор и повторно использует x для хранения матрицы двойных чисел в else пункт. Затем он использует x после if-else оператор. Эта функция генерирует ошибку компиляции, поскольку после if-else оператор, переменная x может иметь различные свойства в зависимости от того, какой if-else Выполняется предложение.

function y = example2(use_fixpoint, data) %#codegen
  if use_fixpoint
			% x is fixed-point
      x = fi(data, 1, 12, 3);
  else
			 % x is a matrix of doubles
      x = data;
  end
  % When x is reused here, it is not possible to determine its
  % class, size, and complexity
  t = sum(sum(x));
  y = t > 0;
end

Пример 3. Повторное использование переменной в операторе if

Чтобы увидеть, как MATLAB переименовывает повторно используемую переменную t:

  1. Создайте файл MATLAB example1.m содержащего следующий код.

    function y = example1(u) %#codegen
    if all(all(u>0))
        % First, t is used to hold a scalar double value
        t = mean(mean(u)) / numel(u);
        u = u - t;
    end
    % t is reused to hold a vector of doubles
    t = find(u > 0);
    y = sum(u(t(2:end-1)));
    end

  2. Сгенерируйте MEX-функцию для example1 и составьте отчет генерации кода.

    codegen -o example1x -report example1.m -args {ones(5,5)}

  3. Откройте отчет генерации кода.

    На вкладке Variables вы видите две однозначно именованные локальные переменные t>1 и t>2.

  4. В списке переменных нажмите t>1. В отчете освещаются образцы переменной t которые находятся внутри if оператор. Эти образцы t являются скаляры двойными.

  5. Нажмите t>2. В отчете о генерации кода подсвечиваются образцы t которые находятся вне if оператор. Эти образцы t являются векторы-столбцы переменного размера с верхней границей 25.

Ограничения переменного повторного использования

В сгенерированном коде нельзя переименовать следующие переменные:

  • Постоянные переменные.

  • Глобальные переменные.

  • Переменные, переданные в код С с помощью coder.ref, coder.rref, coder.wref.

  • Переменные, размер которых задан как coder.varsize.

  • Переменные, имена которых управляются с помощью coder.cstructname.

  • Индексная переменная for-loop, когда он используется внутри тела цикла.

  • Выходы блока MATLAB Function в Simulink® модель.

  • Переменные, принадлежащие диаграмме функции MATLAB в Stateflow® график.