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объединениепересечениеsetdiff, и setxor.

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

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

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