exponenta event banner

Создание кода для сложных данных

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

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

  • Предположим, что функция 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 + bi) (c + di) определяется как (ac - bd) + (ad + bc) i. Полный расчет выполняется, даже если вещественная или мнимая часть равна нулю.

  • Умножение действительного значения на комплексное значение c (a + bi) определяется как ca + cbi.