Генерация кода для комплексных данных

Ограничения при определении сложных переменных

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

  •  Вы передаете действительные входы в функцию, сгенерированную для сложных входов

  •  Вход sort Вывод функции, которая возвращает комплекс в сгенерированном коде

Входы и выходы для MEX-функций, сгенерированных для сложных аргументов

Для 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> я.