我如何能使matlab精度是相同的,在c++

How i can make matlab precision to be the same as in c++?

本文关键字:c++ 何能使 matlab 精度      更新时间:2023-10-16

我有精度问题。我必须使我的c++代码具有与matlab相同的精度。在matlab中,我有脚本做一些东西与数字等。我用c++写的代码和那个脚本一样。相同输入上的输出是不同的:(我发现在我的脚本中,当我尝试104>= 104时,它返回false。我尝试使用格式长,但它并没有帮助我找出为什么它是假的。这两个数都是双精度数。我想也许matlab存储了104的真实值,而它的真实值就像103.9999…所以我在c++中提高了精度。这也没有帮助,因为当matlab在c++中返回我的值为50.000时,我得到的值为50.050,精度很高。这两个值来自像+或*这样的少数计算。有没有办法使我的c++和matlab脚本具有相同的精度?

for i = 1:neighbors
  y = spoints(i,1)+origy;
  x = spoints(i,2)+origx;
  % Calculate floors, ceils and rounds for the x and y.
  fy = floor(y); cy = ceil(y); ry = round(y);
  fx = floor(x); cx = ceil(x); rx = round(x);
  % Check if interpolation is needed.
  if (abs(x - rx) < 1e-6) && (abs(y - ry) < 1e-6)
    % Interpolation is not needed, use original datatypes
    N = image(ry:ry+dy,rx:rx+dx);
    D = N >= C; 
  else
    % Interpolation needed, use double type images 
    ty = y - fy;
    tx = x - fx;
    % Calculate the interpolation weights.
    w1 = (1 - tx) * (1 - ty);
    w2 =      tx  * (1  - ty);
    w3 = (1  - tx) *   ty ;
    w4 =      tx  *    ty ;
    %Compute interpolated pixel values
    N = w1*d_image(fy:fy+dy,fx:fx+dx) + w2*d_image(fy:fy+dy,cx:cx+dx) + ...
    w3*d_image(cy:cy+dy,fx:fx+dx) + w4*d_image(cy:cy+dy,cx:cx+dx);
    D = N >= d_C; 
 end  

在else中有问题,在第12行。Tx和ty等于0.707106781186547或1 - 0.707106781186547。d_image的取值范围是0到255。N的值为0…从图像插值4个像素的255。d_C值为0.255。仍然不知道为什么matlab显示当我在N中有:x x x 140.0000 140.0000和在d_C中:x x x 140 x. D在第4位给我0所以140.0000 != 140。我调试了它,尝试更精确,但它仍然显示它是140.00000000000000,它仍然不是140。

int Codes::Interpolation( Point_<int> point, Point_<int> center , Mat *mat)
{

int x = center.x-point.x;
int y = center.y-point.y;
Point_<double> my;
if(x<0)
{
    if(y<0)
    {
        my.x=center.x+LEN;
        my.y=center.y+LEN;
    }   
    else
    {
        my.x=center.x+LEN;
        my.y=center.y-LEN;
    }
}
else
{
    if(y<0)
    {
        my.x=center.x-LEN;
        my.y=center.y+LEN;
    }   
    else
    {
        my.x=center.x-LEN;
        my.y=center.y-LEN;
    }
}

int a=my.x; 
int b=my.y;
double tx = my.x - a;
double ty = my.y - b;

double wage[4];
wage[0] = (1 - tx) * (1 - ty);
wage[1] =      tx  * (1 - ty);
wage[2] = (1 - tx) *      ty ;
wage[3] =      tx  *      ty ;

int values[4];
//wpisanie do tablicy 4 pixeli ktore wchodza do interpolacji
for(int i=0;i<4;i++)
{
    int val = mat->at<uchar>(Point_<int>(a+help[i].x,a+help[i].y));
    values[i]=val;
}


double moze = (wage[0]) * (values[0])  + (wage[1]) * (values[1]) + (wage[2]) * (values[2])  + (wage[3]) * (values[3]);
return moze;
}

LEN = 0.707106781186547数组值与matlab值100%相同

Matlab使用双精度。你可以使用c++的double类型。这应该使大多数东西相似,但不是100%。正如其他人所说,这可能不是你问题的根源。要么是算法不同,要么是Matlab和c++中定义不同的库函数。例如,Matlab的std()除以(n-1),您的代码可以除以n。

首先,根据经验,直接比较浮点变量从来都不是一个好主意。而不是,例如,如果(nr >= 104),你应该使用如果(nr >= 104-e),其中e是一个小数字,如0.00001

但是,脚本中一定存在严重的欠采样或舍入错误,因为获得50050而不是50000不在常见浮点不精度的限制范围内。例如,Matlab的步长可以小到15位!

我猜你的代码中有一些类型转换问题,例如

int i;
double d;
// ...
d = i/3 * d;

将给出一个非常不准确的结果,因为您使用的是整数除法。d = (double)i/3 * dd = i/3. * d会给出更准确的结果。

上面的例子在Matlab中不会引起任何问题,因为在默认情况下,所有东西都已经是浮点数了,所以在c++和Matlab代码的结果差异背后可能存在类似的问题。

看到你的计算将有助于找到错误的地方。

编辑:在c和c++中,如果将双精度数与相同值的整数进行比较,它们很有可能不相等。对于两个double也是一样的,但是如果你对它们执行完全相同的计算,你可能会很幸运。即使在Matlab中,这也很危险,也许你很幸运,因为它们都是双精度,它们都以同样的方式被截断。你最近的编辑似乎,问题是你在哪里评估你的数组。在c++中(或在任何使用浮点变量的语言中)比较浮点数或双精度数时,不应该使用==或!=。进行比较的正确方法是检查它们是否在彼此的小距离内。

一个例子:使用==或!=来比较两个双精度数,就像通过计算两个物体的原子数来比较它们的重量,即使它们之间有一个原子的差异,也决定它们不相等。

除非另有说明,否则MATLAB使用双精度。您在c++中看到的相同实现的任何差异都是由于浮点错误造成的。