Когда вы активируете создание отчетов о потенциальных различиях, генератор кода сообщает о потенциальных различиях между поведением сгенерированного кода и поведением 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)
.
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 + +, который обнаруживает и сообщает об ошибках времени выполнения.
Чтобы избежать переполнения индекса цикла, используйте обходные пути в этой таблице.
Условия цикла, вызывающие потенциальное переполнение | Работа |
---|---|
| Если цикл не должен покрывать полную область значений целого типа, перепишите цикл так, чтобы конечное значение не равнялось максимальному значению целого типа. Для примера замените: N=intmax('int16') for k=N-10:N for k=1:10 |
| Если цикл не должен покрывать полную область значений целого типа, перепишите цикл так, чтобы конечное значение не равнялось минимальному значению целого типа. Для примера замените: N=intmin('int32') for k=N+10:-1:N for k=10:-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 |
| Перепишите цикл так, чтобы индекс цикла в последней итерации цикла был равен конечному значению. |