Чтобы преобразовать код MATLAB® в эффективный код C/C++, генератор кода представляет оптимизацию, которая намеренно заставляет сгенерированный код, ведут себя по-другому, и иногда приводят к различным результатам, чем код первоисточника.
Вот некоторые различия:
MATLAB поддерживает 16-битные символы, но сгенерированный код представляет символы в 8 битах, стандартный размер для самых встроенных языков как C. Смотрите Кодирование Символов в Генерации кода.
Сгенерированный код не осуществляет порядок оценки в выражениях. Для большинства выражений порядок оценки не является значительным. Однако для выражений с побочными эффектами, сгенерированный код может произвести побочные эффекты в различном порядке от оригинального кода MATLAB. Выражения, которые производят побочные эффекты, включают тех который:
Измените персистентные или глобальные переменные
Отобразите данные на экран
Запишите данные к файлам
Измените свойства объектов класса Handle
Кроме того, сгенерированный код не осуществляет порядок оценки логических операторов, которые не срывают.
Для более предсказуемых результатов это - хорошая практика кодирования, чтобы разделить выражения, которые зависят от порядка оценки в несколько операторов.
Перезапись
A = f1() + f2();
как
A = f1(); A = A + f2();
так, чтобы сгенерированный код вызвал f1
перед f2
.
Присвойте выходные параметры вызова мультивыходной функции переменных, которые не зависят друг от друга. Например, перезапись
[y, y.f, y.g] = foo;
как
[y, a, b] = foo; y.f = a; y.g = b;
Когда вы получаете доступ к содержимому нескольких ячеек массива ячеек, присваиваете результаты переменным, которые не зависят друг от друга. Например, перезапись
[y, y.f, y.g] = z{:};
как
[y, a, b] = z{:}; y.f = a; y.g = b;
Сгенерированный код не совпадает с поведением завершения исходного кода MATLAB. Например, если бесконечные циклы не имеют побочных эффектов, оптимизация удаляет их из сгенерированного кода. В результате сгенерированный код может возможно отключить даже при том, что соответствующий код MATLAB не делает.
Для переменного размера массивы N-D, size
функциональная сила возвращают различный результат в сгенерированном коде, чем в исходном коде MATLAB. Функция size
иногда возвращает запаздывание единиц (одноэлементные размерности) в сгенерированном коде, но всегда пропускает запаздывание единиц в MATLAB. Например, для массива N-D X
с размерностями [4 2 1 1]
, size(X)
может возвратить [4 2 1 1]
в сгенерированном коде, но всегда возвращает [4 2]
в MATLAB. Смотрите Несовместимость с MATLAB в Определении Размера Массивов Variable-Size N-D.
Размер пустого массива в сгенерированном коде может отличаться от его размера в исходном коде MATLAB. Смотрите Несовместимость с MATLAB в Определении Размера Пустых массивов.
Удаление всех элементов массива приводит к пустому массиву. Размер этого пустого массива в сгенерированном коде может отличаться от его размера в исходном коде MATLAB.
Случай | Пример кода | Размер пустого массива в MATLAB | Размер пустого массива в сгенерированном коде |
---|---|---|---|
Удалите все элементы массива m на n при помощи оператора colon (: ). | coder.varsize('X',[4,4],[1,1]);
X = zeros(2);
X(:) = [];
| 0-by-0 | 1-by-0 |
Удалите все элементы вектора - строки при помощи оператора colon (: ). | coder.varsize('X',[1,4],[0,1]);
X = zeros(1,4);
X(:) = []; | 0-by-0 | 1-by-0 |
Удалите все элементы вектора - столбца при помощи оператора colon (: ). | coder.varsize('X',[4,1],[1,0]);
X = zeros(4,1);
X(:) = []; | 0-by-0 | 0-by-1 |
Удалите все элементы вектора - столбца путем удаления одного элемента за один раз. | coder.varsize('X',[4,1],[1,0]); X = zeros(4,1); for i = 1:4 X(1)= []; end | 1-by-0 | 0-by-1 |
Сгенерированный код не может привести к тем же числовым результатам с плавающей точкой как MATLAB в них:
Когда компьютерное оборудование использует регистры расширенной точности
Сгенерированный код не может произвести точно тот же шаблон NaN
и значений Inf
как код MATLAB, когда эти значения математически бессмысленны. Например, если MATLAB вывел, содержит NaN
, выведенный от сгенерированного кода должен также содержать NaN
, но не обязательно в том же месте.
Комбинация двоичных разрядов для NaN
может отличаться между кодом MATLAB вывод и сгенерированным кодом вывод, потому что стандартная математическая библиотека C99, которой пользуются, чтобы сгенерировать код, не задает уникальную комбинацию двоичных разрядов для NaN
через все реализации. Постарайтесь не сравнивать комбинации двоичных разрядов через различные реализации, например, между MATLAB вывод и SIL или PIL вывод.
В типе с плавающей точкой значение 0
имеет или положительный знак или знак минус. Арифметически, 0
равен -0
, но некоторые операции чувствительны к знаку 0 входных параметров. Примеры включают rdivide
, atan2
, atan2d
и angle
. Деление 0
производит Inf
, но деление -0
производит -Inf
. Точно так же atan2d(0,-1)
производит 180
, но atan2d (-0,-1)
производит -180
.
Если генератор кода обнаруживает, что переменная с плавающей точкой принимает только целочисленные значения подходящей области значений, то генератор кода может использовать целый тип для переменной в сгенерированном коде. Если генератор кода использует целый тип для переменной, то переменная хранит -0
как +0
, потому что целый тип не хранит знак для значения 0
. Если сгенерированный код бросает переменную назад к типу с плавающей точкой, знак 0
положителен. Деление 0
производит Inf
, не -Inf
. Точно так же atan2d(0,-1)
производит 180
, не -180
.
Функция coder.target
возвращает различные значения в MATLAB, чем в сгенерированном коде. Намерение состоит в том, чтобы помочь вам определить, выполняется ли ваша функция в MATLAB или была скомпилирована для цели генерации кода или моделирования. Смотрите coder.target
.
Перед генерацией кода, во время загрузки класса, MATLAB вычисляет значения по умолчанию класса. Генератор кода использует значения, которые вычисляет MATLAB. Это не повторно вычисляет значения по умолчанию. Если определение свойства использует вызов функции вычислить начальное значение, генератор кода не выполняет эту функцию. Если функция имеет побочные эффекты, такие как изменение глобальной переменной или персистентной переменной, то возможно, что сгенерированный код может привести к различным результатам, которые производит MATLAB. Для получения дополнительной информации смотрите Defining Class Properties для Генерации кода.
При использовании объектов с методами доступа свойства результаты симуляции могут отличаться от результатов MATLAB. Эти различия происходят, когда объекты:
Введите к или выведите от функции точки входа.
Пройден к или возвратился из внешней функции.
Загруженный в память при помощи load
.
Результаты могут отличаться при этих условиях:
Получить метод возвращает различное значение от сохраненного значения свойства.
Метод установки изменяет входное значение прежде, чем присвоить его свойству.
Получить метод или метод установки имеют побочные эффекты, такие как изменение глобальной переменной или запись в файл.
Результаты могут отличаться из-за несоответствий в использовании методов доступа свойства, когда MATLAB и передача программного обеспечения моделирования возражают друг против друга:
Если вы возвращаете объект во внешнюю функцию, MATLAB передает объект программному обеспечению моделирования. Программное обеспечение моделирования создает свою собственную версию объекта. Чтобы предоставить значения свойств процессу создания объекта, вызовы MATLAB получают методы. Процесс создания объекта присваивает эти значения свойств от MATLAB непосредственно к новому объекту, не вызывая методы установки.
Когда вы передаете объект внешней функции для выполнения в MATLAB, программное обеспечение моделирования передает объект MATLAB. MATLAB создает свою собственную версию объекта. Чтобы предоставить значения свойств MATLAB, вместо использования получают методы, программное обеспечение моделирования непосредственно читает значения свойств. Чтобы присвоить значения свойств в версии MATLAB объекта, процесс создания использует методы установки.
Чтобы избежать различий в результатах между MATLAB и моделированием, не используйте классы с методами доступа свойства в этих случаях.
Для получения дополнительной информации смотрите Defining Class Properties для Генерации кода.
Поведение деструкторов класса Handle в сгенерированном коде может отличаться от поведения в MATLAB в этих ситуациях:
Порядок разрушения нескольких независимых объектов может отличаться в MATLAB, чем в сгенерированном коде.
Время жизни объектов в сгенерированном коде может отличаться с их времени жизни в MATLAB.
Сгенерированный код не уничтожает частично созданные объекты. Если объект указателя не полностью создается во время выполнения, сгенерированный код производит сообщение об ошибке, но не вызывает метод delete
для того объекта. Для Системы object™, если существует ошибка времени выполнения в setupImpl
, сгенерированный код не вызывает releaseImpl
для того объекта.
MATLAB действительно вызывает метод delete
, чтобы уничтожить частично созданный объект.
Для получения дополнительной информации смотрите Генерацию кода для Деструкторов Класса Handle.
Смотрите несовместимости с MATLAB в поддержке Переменного Размера генерации кода.
Смотрите генерацию кода для комплексных данных.
double
При преобразовании строки, которая содержит несколько, последовательные унарные операторы к double
могут привести к различным результатам между MATLAB и сгенерированным кодом. Рассмотрите эту функцию:
function out = foo(op) out = double(op + 1); end
Для входного значения "--"
функция преобразовывает строку "--1"
в double
. В MATLAB ответом является NaN
. В сгенерированном коде ответом является 1
.