Можно повторно использовать (переназначить) вход, вывод или локальную переменную с разным классом, размером или сложностью, если генератор кода может однозначно определить свойства каждого вхождения этой переменной во время генерации кода 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
Чтобы увидеть, как MATLAB переименовывает повторно используемую переменную t
:
Создайте файл 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
Сгенерируйте MEX-функцию для example1
и составьте отчет генерации кода.
codegen -o example1x -report example1.m -args {ones(5,5)}
Откройте отчет генерации кода.
На вкладке Variables вы видите две однозначно именованные локальные переменные t>1
и t>2
.
В списке переменных нажмите t>1
. В отчете освещаются образцы переменной t которые находятся внутри
if
оператор. Эти образцы t
являются скаляры двойными.
Нажмите t>2
. В отчете о генерации кода подсвечиваются образцы t
которые находятся вне if
оператор. Эти образцы t
являются векторы-столбцы переменного размера с верхней границей 25
.
Следующие переменные не могут быть переименованы в сгенерированный код:
Постоянные переменные.
Глобальные переменные.
Переменные, переданные в код С с помощью coder.ref
, coder.rref
, coder.wref
.
Переменные, размер которых задан как coder.varsize
.
Индексная переменная for
-loop, когда он используется внутри тела цикла.
Выходы блока MATLAB Function в Simulink® модель.
Переменные, принадлежащие диаграмме функции MATLAB в Stateflow® график.