Сообщения разностей потенциалов

Когда вы включаете создание отчетов разностей потенциалов, генератор кода сообщает о разностях потенциалов между поведением сгенерированного кода и поведением кода 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 применяет специальное правило. Специальное правило индексации векторного вектора состоит в том, что ориентация результата является ориентацией матрицы данных. Например, 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 that the sizes on the left and
right sides match.

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

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

Рассмотрите эту функцию:

function y = scalar_exp_test_err1(u) %#codegen
y = ones(3);
switch u
    case 0
        z = 0;
    case 1
        z = 1;
    otherwise
        z = zeros(3);
end
y(:) = z;

Когда вы генерируете код для этой функции, генератор кода определяет тот z переменный размер с верхней границей 3.

Если при запуске MEX-функцию с u равняйтесь 0 или 1, сгенерированный код не выполняет скалярное расширение, даже при том, что z скаляр во время выполнения. Поэтому, когда проверки ошибки времени выполнения включены, ошибка времени выполнения может произойти.

scalar_exp_test_err1_mex(0)
Subscripted assignment dimension mismatch: [9] ~= [1].

Error in scalar_exp_test_err1 (line 11)
y(:) = z;

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

function y = scalar_exp_test_err1(u) %#codegen
y = ones(3);
switch u
    case 0
        z = 0;
    case 1
        z = 1;
    otherwise
        z = zeros(3);
end
y(:) = z(1);

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

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- значение конца цикла равно или близко к максимальному или минимальному значению для типа данных индекса цикла. В сгенерированном коде последний шаг или декремент индекса цикла могут заставить индексную переменную переполняться. Переполнение индекса может привести к бесконечному циклу.

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

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

Условия цикла, вызывающие потенциальное переполнениеРабота вокруг
  • Индекс цикла постепенно увеличивается 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.

  • На последней итерации цикла индекс цикла не равен в конец значение.

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

Похожие темы