Сообщения о потенциальных различиях

Когда вы активируете создание отчетов о потенциальных различиях, генератор кода сообщает о потенциальных различиях между поведением сгенерированного кода и поведением MATLAB® код. Просмотр и устранение потенциальных различий перед генерацией автономного кода помогает избежать ошибок и неправильных ответов в сгенерированном коде.

Вот некоторые сообщения о потенциальных различиях:

Несовместимость автоматической размерности

In the generated code, the dimension to operate along is
selected automatically, and might be different from MATLAB.
Consider specifying the working dimension explicitly as a
constant value.

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

Например, предположим, что X - матрица переменного размера с размерностями 1x:3x:5. В сгенерированном коде sum(X) ведет себя как sum(X,2). В MATLAB, sum(X) ведет себя как sum(X,2) если только size(X,2) равен 1. В MATLAB, когда size(X,2) равен 1, sum(X) ведет себя как sum(X,3).

Чтобы избежать этой проблемы, задайте предполагаемую рабочую размерность явно как постоянное значение. Для примера, sum(X,2).

mtimes Нет Динамического Скалярного Расширения

The generated code performs a general matrix multiplication.
If a variable-size matrix operand becomes a scalar at run
time, dimensions must still agree. There will not be an
automatic switch to scalar multiplication.

Рассмотрим A*B умножения. Если генератор кода знает, что A скаляром и B является матрицей, генератор кода производит код для скалярно-матричного умножения. Однако, если генератор кода знает, что A и B являются матрицами переменного размера, это создает код для общего матричного умножения. Во время исполнения, если A оказывается скалярным, сгенерированный код не меняет своего поведения. Поэтому, когда проверки ошибок времени выполнения включены, может возникнуть ошибка несоответствия размера.

Матрично-матричное индексирование

For indexing a matrix with a matrix, matrix1(matrix2), the
code generator assumed that the result would have the same
size as matrix2. If matrix1 and matrix2 are vectors at run
time, their orientations must match.

При матрично-матричном индексировании вы используете одну матрицу для индекса в другую матрицу. В MATLAB общее правило для индексации матрицы-матрицы состоит в том, что размер и ориентация результата совпадают с размером и ориентацией матрицы индекса. Для примера, если A и B матрицы, size(A(B)) равен size(B). Когда A и B являются векторами, MATLAB применяет специальное правило. Специальное правило индексации вектор-вектор состоит в том, что ориентация результата является ориентацией матрицы данных. Например, я A 1 на 5 и B 3 на 1, затем A(B) 1 на 3.

Генератор кода применяет те же правила индексации матрицы-матрицы, что и MATLAB. Если A и B являются матрицами переменного размера, для применения правил индексации матриц и матриц генератор кода принимает, что size(A(B)) равен size(B). Если во время исполнения A и B стать векторами и иметь различные ориентации, тогда предположение неверно. Поэтому, когда проверки ошибок времени выполнения включены, может возникнуть ошибка.

Чтобы избежать этой проблемы, заставьте ваши данные быть вектором при помощи оператора двоеточия для индексации. Например, предположим, что ваш код намеренно переключается между векторами и регулярными матрицами во время исполнения. Можно выполнить явную проверку для векторно-векторной индексации.

...
if isvector(A) && isvector(B)
    C = A(:);
    D = C(B(:));
else
    D = A(B);
end
...

Индексация в первой ветви задает, что C и B(:) являются векторами во время компиляции. Поэтому генератор кода применяет правило индексации для индексации одного вектора с другим вектором. Ориентацией результата является ориентация вектора данных, C.

Векторно-векторное индексирование

For indexing a vector with a vector, vector1(vector2), the
code generator assumed that the result would have the same
orientation as vector1. If vector1 is a scalar at run time,
the orientation of vector2 must match vector1.

В MATLAB специальное правило для векторно-векторной индексации заключается в том, что ориентация результата является ориентацией вектора данных. Для примера, если A 1 на 5 и B 3 на 1, затем A(B) 1 на 3. Если, однако, вектор данных A является скаляром, тогда ориентация A(B) - ориентация вектора индекса B.

Генератор кода применяет те же правила индексации векторов и векторов, что и MATLAB. Если A и B являются векторами переменного размера, для применения правил индексации генератор кода принимает, что ориентация B соответствует ориентации A. Во время исполнения, если A скаляром и ориентацией A и B не совпадать, тогда предположение неверно. Поэтому, когда проверки ошибок времени выполнения включены, может возникнуть ошибка времени выполнения.

Чтобы избежать этой проблемы, заставьте ориентации векторов совпадать. Кроме того, индексируйте отдельные элементы путем определения строки и столбца. Для примера, A(row, column).

Переполнение индекса цикла

The generated code assumes the loop index does not overflow on
the last iteration of the loop. If the loop index overflows,
an infinite loop can occur.

Предположим, что for-loop end value равно или близко к максимальному или минимальному значению для типа индексных данных цикла. В сгенерированном коде последний шаг или уменьшение индекса цикла может привести к переполнению индексной переменной. Переполнение индекса может привести к бесконечному циклу.

Когда проверки целостности памяти включены, если генератор кода обнаруживает, что индекс цикла может переполниться, он сообщает об ошибке. Проверка программных ошибок является консервативной. Это может неправильно сообщить о переполнении индекса цикла. По умолчанию проверки целостности памяти включены для кода MEX и отключены для автономного кода C/C + +. Смотрите, зачем тестировать MEX-функции в MATLAB? и Сгенерируйте автономный код C/C + +, который обнаруживает и сообщает об ошибках времени выполнения.

Чтобы избежать переполнения индекса цикла, используйте обходные пути в этой таблице.

Условия цикла, вызывающие потенциальное переполнениеРабота
  • Индекс цикла увеличивается на 1.

  • Конечное значение равняется максимальному значению целого типа.

Если цикл не должен покрывать полную область значений целого типа, перепишите цикл так, чтобы конечное значение не равнялось максимальному значению целого типа. Для примера замените:

N=intmax('int16')
for k=N-10:N
с:
for k=1:10

  • Индекс цикла уменьшается на 1.

  • Конечное значение равняется минимальному значению целого типа.

Если цикл не должен покрывать полную область значений целого типа, перепишите цикл так, чтобы конечное значение не равнялось минимальному значению целого типа. Для примера замените:

N=intmin('int32')
for k=N+10:-1:N
с:
for k=10:-1:1

  • Индекс цикла увеличивается или уменьшается на 1.

  • Начальное значение равняется минимальному или максимальному значению целого типа.

  • Конечное значение равняется максимальному или минимальному значению целого типа.

Если цикл должен охватывать всюсь область значений целого типа, приведите тип начального, шагового и конечного значений цикла к большему целому или к двойному. Для примера перепишите:

M= intmin('int16');
N= intmax('int16');
for k=M:N
	% Loop body
end
как:
M= intmin('int16');
N= intmax('int16');
for k=int32(M):int32(N)
	% Loop body
end

  • Индекс цикла увеличивается или уменьшается на значение, не равное 1.

  • При последней итерации цикла индекс цикла не равен конечному значению.

Перепишите цикл так, чтобы индекс цикла в последней итерации цикла был равен конечному значению.

Похожие темы