Когда вы включаете создание отчетов разностей потенциалов, генератор кода сообщает о разностях потенциалов между поведением сгенерированного кода и поведением кода 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 применяет специальное правило. Специальное правило индексации векторного вектора состоит в том, что ориентация результата является ориентацией матрицы данных. Например, iA
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.
Предположим это a for
- значение конца цикла равно или близко к максимальному или минимальному значению для типа данных индекса цикла. В сгенерированном коде последний шаг или декремент индекса цикла могут заставить индексную переменную переполняться. Переполнение индекса может привести к бесконечному циклу.
Когда проверки целостности памяти включены, если генератор кода обнаруживает, что индекс цикла может переполниться, это сообщает об ошибке. Проверка программной ошибки консервативна. Это может неправильно сообщить о переполнении индекса цикла. По умолчанию проверки целостности памяти включены для кода MEX и отключены для автономного кода C/C++. Видеть Зачем тестировать MEX-функции в MATLAB? (MATLAB Coder) и Генерирует Автономный Код C/C++, который Обнаруживает и Ошибки времени выполнения Отчетов (MATLAB Coder).
Чтобы избежать переполнения индекса цикла, используйте обходные решения в этой таблице.
Условия цикла, вызывающие потенциальное переполнение | Работа вокруг |
---|---|
| Если цикл не должен покрывать полный спектр целочисленного типа, переписать цикл так, чтобы значение конца не было равно максимальному значению целочисленного типа. Например, замена: 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 |
| Перепишите цикл так, чтобы индекс цикла в последней итерации цикла был равен в конец значение. |