Для генерации кода необходимо установить сложность переменных во время присвоения. Присвойте комплексную константу переменной или используйте функцию 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-функций, созданных MATLAB Coder™ :
Предположим, что вы генерируете MEX-функцию для комплексных входных параметров. Если вы вызываете MEX-функцию с действительными входными параметрами, MEX-функция преобразовывает действительные входные параметры, чтобы объединить значения с мнимыми частями с нулевым знаком.
Если MEX-функция возвращает комплексные значения, которые имеют все мнимые части с нулевым знаком, MEX-функция возвращает значения к MATLAB workspace как действительные значения. Например, рассмотрите эту функцию:
function y = foo() y = 1 + 0i; % y is complex with imaginary part equal to zero end
Если вы генерируете MEX-функцию для foo
и просматриваете отчет генерации кода, вы видите, что y
является комплексным.
codegen foo -report
Если при запуске MEX-функцию, вы видите, что в MATLAB workspace, результатом 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 workspace как действительные значения. Смотрите Вводы и выводы для 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.