我如何使matlab精度与c ++中的相同?

时间:2011-10-11 16:59:53

标签: c++ matlab precision

我的精确度有问题。我必须使我的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  

我在第12行的其他问题中遇到了问题.tx和ty eqauls 0.707106781186547或1 - 0.707106781186547。来自d_image的值在0和255范围内.N是从图像插值4个像素的值0..255。 d_C的值为0.255。仍然不知道为什么matlab显示当我有N个版本时:x x x 140.0000 140.0000和d_C:x x x 140 x。 D给我0第4位,所以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%相同。

3 个答案:

答案 0 :(得分:2)

Matlab使用双精度。你可以使用C ++的double类型。这应该使大多数事情相似,但不是100%。 正如其他人所说,这可能不是您问题的根源。算法中存在差异,或者它可能类似于在Matlab和C ++中以不同方式定义的库函数。例如,Matlab的std()除以(n-1),你的代码可以除以n。

答案 1 :(得分:1)

首先,根据经验,直接比较浮点变量绝不是一个好主意。例如,而不是if (nr >= 104),而不应使用if (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 ++(或使用浮点变量时的任何语言)中的浮点数或双精度数时,不应使用==或!=。进行比较的正确方法是检查它们是否在彼此的小距离内。

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

答案 2 :(得分:0)

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