Для создания кода необходимо задать сложность переменных во время присвоения. Назначьте переменной комплексную константу или используйте 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, но сложна с нулевыми мнимыми частями в сгенерированном коде:
Как правило, выражения, содержащие один или несколько сложных операндов, дают комплексный результат в сгенерированном коде, даже если значение результата равно нулю. Рассмотрим следующую строку кода:
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 + bi) (c + di) определяется как (ac - bd) + (ad + bc) i. Полный расчет выполняется, даже если вещественная или мнимая часть равна нулю.
Умножение действительного значения на комплексное значение c (a + bi) определяется как ca + cbi.