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 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.