Для создания кода необходимо задать сложность переменных во время присвоения. Назначьте переменной комплексную константу или используйте 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, но сложна с нулевыми мнимыми частями в сгенерированном коде:
Для функций MEX, созданных MATLAB Coder™:
Предположим, что функция MEX создается для сложных входов. При вызове функции MEX с вещественными входами функция MEX преобразует вещественные входы в комплексные значения с нулевыми мнимыми частями.
Если функция MEX возвращает комплексные значения, которые имеют все мнимые детали с нулевым значением, функция MEX возвращает значения в рабочую область MATLAB в виде вещественных значений. Например, рассмотрим эту функцию:
function y = foo() y = 1 + 0i; % y is complex with imaginary part equal to zero end
При создании функции MEX для foo и просмотреть отчет о создании кода, вы видите, что y является сложным.
codegen foo -report

При выполнении функции MEX в рабочей области MATLAB отображается результат foo_mex - действительное значение 1.
z = foo_mex
ans =
1
Как правило, выражения, содержащие один или несколько сложных операндов, дают комплексный результат в сгенерированном коде, даже если значение результата равно нулю. Рассмотрим следующую строку кода:
z = x + y;
Предположим, что во время выполнения, x имеет значение 2 + 3i и y имеет значение 2 - 3i. В MATLAB этот код дает реальный результат z = 4. Во время создания кода типы для x и y известны, но их значения не известны. Поскольку один или оба операнда в этом выражении сложны, z определяется как комплексная переменная, требующая хранения для вещественной и мнимой части. z равен комплексному результату 4 + 0i в сгенерированном коде, не 4, как в коде MATLAB.
Исключения из этого поведения:
Когда мнимые части комплексных результатов равны нулю, функции MEX возвращают результаты в рабочую область MATLAB в виде вещественных значений. См. раздел Входы и выходы для функций MEX, созданных для сложных аргументов.
Когда мнимая часть аргумента равна нулю, сложные аргументы для внешних функций вещественны.
function y = foo()
coder.extrinsic('sqrt')
x = 1 + 0i; % x is complex
y = sqrt(x); % x is real, y is real
end Функции, которые принимают сложные аргументы, но дают реальные результаты, возвращают реальные значения.
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.