ошибка кодегена: левая часть была ограничена, чтобы быть несложной, но правая часть сложна

Я новичок в Matlab и пытаюсь скомпилировать устаревший код Matlab в C. При этом я сталкиваюсь со следующей ошибкой:

??? Левая часть должна быть несложной, но правая часть является сложной. Чтобы исправить эту проблему, сделайте правую часть вещественной, используя функцию REAL, или измените начальное присваивание левой части переменной, чтобы она была комплексным значением, с помощью функции КОМПЛЕКС.

Код, на который он жалуется, находится в комментариях к коду ниже:

function [z_out,ovf_flag,ovf_cnt] = fxpt_sgn_saturate(z_in,Nb_out)
Nb_out=(Nb_out<=0)+(Nb_out>0)*Nb_out;
max_val =  2^(Nb_out-1)-1;
min_val = -2^(Nb_out-1);
ovf_cnt = 0;
tmp_ind = find(real(z_in) > max_val);
z_in(tmp_ind) = max_val+1j*imag(z_in(tmp_ind)); // ERROR OCCURS HERE
ovf_cnt = ovf_cnt + numel(tmp_ind);
tmp_ind = find(real(z_in) < min_val);
z_in(tmp_ind) = min_val+1j*imag(z_in(tmp_ind));
ovf_cnt = ovf_cnt + numel(tmp_ind);
tmp_ind = find(imag(z_in) > max_val);
z_in(tmp_ind) = real(z_in(tmp_ind))+1j*max_val;
ovf_cnt = ovf_cnt + numel(tmp_ind);
tmp_ind = find(imag(z_in) < min_val);
z_in(tmp_ind) = real(z_in(tmp_ind))+1j*min_val;
ovf_cnt = ovf_cnt + numel(tmp_ind);
z_out = z_in;
ovf_flag = ~(ovf_cnt==0);
return

Я плохо понимаю код. Любые идеи, как решить эту проблему?

Спасибо


person noobuntu    schedule 07.03.2017    source источник
comment
Вы указали, что z_in должно быть реальным?   -  person Suever    schedule 08.03.2017
comment
Похоже, он жалуется из-за типа массива, которым является z_in. Возможно, вы пытаетесь привести его к complex перед запуском кода?   -  person rayryeng    schedule 08.03.2017


Ответы (1)


При создании кода вы можете использовать -args флаг, чтобы указать размер, класс и сложность ваших входных аргументов. Вы можете явно указать z_in как комплексное число, чтобы убедиться, что генерация кода прошла успешно.

codegen fxpt_sgn_saturate -args {complex(z_in), double(Nb_out)}

В качестве альтернативы, если вы вызываете эту функцию из многих других функций и вызываете только codegen для функции верхнего уровня, вам нужно явно привести входные данные как сложный тип данных в вашем коде до вызова функции, чтобы codegen может правильно определить сложность ввода.

function a(thing)
    fxpt_sgn_saturate(complex(thing), 10);
end
person Suever    schedule 07.03.2017
comment
Эта функция встроена глубоко в мою интерфейсную функцию. Я вызываю codegen для функции верхнего уровня. - person noobuntu; 08.03.2017
comment
@noobuntu Тогда вам нужно явно указать его как сложный тип данных. Смотрите обновление. - person Suever; 08.03.2017