exponenta event banner

Генерация кода для комплексных данных

Ограничения при определении сложных переменных

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

x = 5 + 6i; % x is a complex number by assignment.
y = complex(5,6); % y is the complex number 5 + 6i.

После назначения вы не можете изменить сложность переменной. Генерация кода для следующей функции прекращается из-за x(k) = 3 + 4i изменяет сложность x.

function x = test1( )
x = zeros(3,3); % x is real
for k = 1:numel(x)
    x(k) = 3 + 4i;
end
end

Чтобы решить эту проблему, присвойте комплексную константу x.

function x = test1( )
x = zeros(3,3)+ 0i; %x is complex
for k = 1:numel(x)
    x(k) = 3 + 4i;
end
end

Генерация кода для комплексных данных с нулевыми воображаемыми деталями

Для генерации кода комплексные данные, которые имеют все нулевые мнимые части, остаются комплексными. Эти данные не становятся реальными. Это поведение имеет следующие последствия:

  • В некоторых случаях результаты функций, которые сортируют комплексные данные по абсолютному значению, могут отличаться от MATLAB® результаты. Смотрите функции, которые сортируют комплексные числа по абсолютным значениям.

  • Для функций, которые требуют, чтобы комплексные входы сортировались по абсолютному значению, комплексные входы с нулевыми мнимыми частями должны сортироваться по абсолютному значению. Эти функции включают ismember, union, intersect, setdiff, и setxor.

Функции, которые сортируют комплексные числа по абсолютным значениям

Функции, которые сортируют комплексные числа по абсолютному значению, включают sort, issorted, sortrows, median, min, и max. Эти функции сортируют комплексные числа по абсолютному значению, даже когда мнимые части равны нулю. В целом сортировка абсолютных значений приводит к другому результату, чем сортировка вещественных частей. Поэтому, когда входы в эти функции комплексны с нулевыми мнимыми частями в сгенерированном коде, но действительны в MATLAB, сгенерированный код может привести к другим результатам, чем MATLAB. В следующих примерах вход в sort реально в MATLAB, но комплексно с нулевыми мнимыми частями в сгенерированном коде:

  •  Вы передаете действительные входы в функцию, сгенерированную для сложных входов

  •  Вход sort Вывод функции, которая возвращает комплекс в сгенерированном коде

Результаты выражений, которые имеют сложные операнды

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

z = x + y; 

Предположим, что во время исполнения x имеет значение 2 + 3i и y имеет значение 2 - 3i. В MATLAB этот код дает реальный результат z = 4. Во время генерации кода типы для x и y известны, но их значения неизвестны. Поскольку одна или обе операнды в этом выражении являются комплексными, z определяется как комплексная переменная, требующая хранения для действительной и мнимой части z. равен комплексному результату 4 + 0i в сгенерированном коде, не 4, как в коде MATLAB.

Исключения из этого поведения:

  • Функции, которые берут сложные аргументы, но дают реальные результаты, возвращают вещественные значения.

    y = real(x); % y is the real part of the complex number x.
    y = imag(x); % y is the real-valued imaginary part of x.
    y = isreal(x); % y is false (0) for a complex number x.
    
  • Функции, которые берут действительные аргументы, но приводят к комплексным результатам, возвращают комплексные числа.

    z = complex(x,y); % z is a complex number for a real x and y.
    

Результаты комплексного умножения с нефинитными значениями

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

  • Умножение комплексного числа комплексным числом (a + <reservedrangesplaceholder10> i) (c + <reservedrangesplaceholder8> i) определен как (a c - <reservedrangesplaceholder5> <reservedrangesplaceholder4>) + (a d + <reservedrangesplaceholder1> <reservedrangesplaceholder0>) я. Полное вычисление выполняется, даже когда действительная или мнимая часть равна нулю.

  • Умножение реального значения комплексным числом c (a + <reservedrangesplaceholder4> i) определен как <reservedrangesplaceholder3> <reservedrangesplaceholder2> + <reservedrangesplaceholder1> <reservedrangesplaceholder0> я.