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 + <reservedrangesplaceholder10> i) (c + <reservedrangesplaceholder8> i) определен как (a c - <reservedrangesplaceholder5> <reservedrangesplaceholder4>) + (a d + <reservedrangesplaceholder1> <reservedrangesplaceholder0>) я. Полное вычисление выполняется, даже когда действительная или мнимая часть равна нулю.

  • Умножение реального значения комплексным числом c (a + <reservedrangesplaceholder4> i) определен как <reservedrangesplaceholder3> <reservedrangesplaceholder2> + <reservedrangesplaceholder1> <reservedrangesplaceholder0> я.