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

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

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

Функции, что сортировка комплексных чисел абсолютным значением

Функции, что комплексные числа вида абсолютным значением включают sortissortedsortrowsмедиана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 + b i) (c + d i) задано как (a c - b d) + (a d + b c) i. Полное вычисление выполняется, даже когда действительным или мнимой частью является нуль.

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