0

我是 matlab 新手,正在尝试将遗留的 matlab 代码编译成 C。这样做时遇到以下错误:

???左侧被限制为非复杂的,但右侧是复杂的。要更正此问题,请使用函数 REAL 使右侧为实数,或使用 COMPLEX 函数将左侧变量的初始赋值更改为复数。

它抱怨的代码在下面代码的注释中:

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

我不是特别了解代码。任何想法如何解决这个问题?

谢谢

4

1 回答 1

4

生成代码时,您可以使用该-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
于 2017-03-07T23:00:53.813 回答