Можно повторно использовать (переназначить) входную, выходную или локальную переменную с различным классом, размером или сложностью, если генератор кода может однозначно определить свойства каждого вхождения этой переменной во время генерации кода C/C + +. Если это так, MATLAB ® создает отдельные уникальные локальные переменные в сгенерированном коде. Эти переименованные переменные можно просмотреть в отчете о создании кода.
Типичным примером многократного использования переменных является if-elseif-else или switch-case заявления. Например, следующая функция example1 сначала использует переменную t в if оператор, где он содержит скалярный двойник, затем повторно использует 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.
Следующие переменные не могут быть переименованы в созданном коде:
Постоянные переменные.
Глобальные переменные.
Переменные, переданные в код C с помощью coder.ref, coder.rref, coder.wref.
Переменные, размер которых задается с помощью coder.varsize.
Переменные, имена которых управляются с помощью coder.cstructname.
Переменная индекса for-закольцовывание при его использовании внутри тела контура.
Вывод блоков функционального блока MATLAB в модели Simulink ®.
Переменные, принадлежащие функции MATLAB в диаграмме Stateflow ®.