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