MATLAB转MEX文件时复数域错误及赋值问题问询
问题分析与解决
第一个错误的原因
原代码里的sqrt(-1)是在实数上下文执行的,MATLAB默认把-1当作实数处理,负数开平方属于实数域的非法操作,所以抛出域错误。改成sqrt(complex(-1))后,相当于显式将输入转为复数,能合法算出虚数单位,但此时计算出的g会变成复数类型。
第二个错误的根源
Ge变量初始化时被定义成了实数数组(比如直接用Ge = 0;这类方式),当你试图把含复数g的运算结果赋值给它时,就会触发错误——MATLAB(尤其是MEX编译模式下)不允许把复数值存入预先分配好的实数内存空间。
解决方法
- 简化虚数单位写法:直接用MATLAB内置的
1i代替sqrt(complex(-1)),代码更简洁高效:g = 2*exp(-1i*k*r)/(4*pi*r); - 提前将Ge初始化为复数类型:在使用
Ge之前,把它初始化为复数数组,比如:
如果Ge = 0 + 0i; % 也可以用 Ge = complex(0);Ge是矩阵,就对应初始化复数矩阵,比如Ge = zeros(m,n)+0i;
这样修改后,既能解决域错误,也能让复数结果正确存入Ge中。
内容的提问来源于stack exchange,提问作者PRITAM PATTANAYAK
相关产品推荐
相关产品推荐

