Для генерации кода необходимо установить сложность переменных во время присвоения. Присвойте комплексную константу переменной или используйте 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.