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

Когда вы включаете создание отчетов разностей потенциалов, генератор кода сообщает о разностях потенциалов между поведением сгенерированного кода и поведением кода 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);

Похожие темы