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