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

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