Можно снова использовать (повторно присваивают) вход, выводят, или локальная переменная с различным классом, размером или сложностью, если генератор кода может однозначно определить свойства каждого вхождения этой переменной во время генерации кода C/C++. If so, 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.
Следующие переменные не могут быть переименованы в сгенерированном коде:
Персистентные переменные.
Глобальные переменные.
Переменные передали коду С с помощью coder.ref, coder.rref, coder.wref.
Переменные, размер которых установлен с помощью coder.varsize.
Индексная переменная for- цикл, когда это используется в теле цикла.
Блок выходные параметры блока MATLAB Function в модели Simulink®.
Переменные, находящиеся в собственности графика функции MATLAB в графике Stateflow®.