你好每个人我都写了一些代码作为Mfiles并使用Matlab函数生成一个自动S函数,每件事都很好但是由于某些原因我被迫自己编写C函数。
现在的问题是这样的:我只是将代码翻译成C,它们在视觉工作室中没问题,但是当我在我的功能中使用它们时,我得到了一些无效的答案。 (NAN)。
我检查了第一个地方,我的答案变成了NaN,我发现它是在想要运行我的QR分解代码的时候。
a& b是doubles
,当a=-0.00000
& b=0.000000
它返回NaN,而代码如下:
if (b==0)
{
c=1;
s=0;
}
else if (abs(b)>abs(a))
{
r=a/b;
s=1/sqrt(1+r*r);
c=r*s;
}
else
{
r=b/a;
s=1/sqrt(1+r*r);
c=r*s;
}
我甚至将条件改为:
如果(ABS(B)< 0.001))
但它再次没有进入这种状况。
为了避免使用NaN我将最后else
更改为:else if(a!=0)
并添加了一个新的其他只是拳头如果。我的意思是:
if (b==0)
{
c=1;
s=0;
} else if (abs(b)>abs(a))
{
r=a/b;
s=1/sqrt(1+r*r);
c=r*s;
}else if(a!=0)
{
r=b/a;
s=1/sqrt(1+r*r);
c=r*s;
}else
{
c=1;
s=0;
}
但是:1。这不是一个好方法(只是一个技巧)2。我的最终答案有错误(10 ^( - 5))
现在作为结论:1。我需要知道为什么视觉效果与Matlab不相同的相同代码? 我该怎么办?我处于紧急状态,我需要一种很好的方法来计算与S函数兼容的C中矩阵的QR分解。或者至少是计算矩阵确定性的好方法,即使它接近奇点。
答案 0 :(得分:4)
你在visual studio和MATLAB(sfunction)上获得不同结果的原因很可能是你的程序的行为未定义。
条件abs(b)>abs(a)
是错误的。 abs
期望int
类型参数返回int
。在您将a
和b
定义为double
时,您应该使用fabs
;期望double
类型参数并返回double
值。
else if (fabs(b) > fabs(a)){ ... }