Для генерации кода необходимо установить сложность переменных во время присвоения. Присвойте комплексную константу переменной или используйте функцию 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-функций, созданных fiaccel:
Предположим, что вы генерируете 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 + b i) (c + d i) задано как (a c - b d) + (a d + b c) i. Полное вычисление выполняется, даже когда действительным или мнимой частью является нуль.
Умножение действительного значения комплексным числом c (a + b i) задано как c a + c b i.