Для генерации кода необходимо задать сложность переменных во время присвоения. Присвойте переменной комплексную константу или используйте 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 + <reservedrangesplaceholder10> i) (c + <reservedrangesplaceholder8> i) определен как (a c - <reservedrangesplaceholder5> <reservedrangesplaceholder4>) + (a d + <reservedrangesplaceholder1> <reservedrangesplaceholder0>) я. Полное вычисление выполняется, даже когда действительная или мнимая часть равна нулю.
Умножение реального значения комплексным числом c (a + <reservedrangesplaceholder4> i) определен как <reservedrangesplaceholder3> <reservedrangesplaceholder2> + <reservedrangesplaceholder1> <reservedrangesplaceholder0> я.