Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使matlab精度与c+中的精度相同+;?_C++_Matlab_Precision - Fatal编程技术网

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

C++ 如何使matlab精度与c+中的精度相同+;?,c++,matlab,precision,C++,Matlab,Precision,我对精确性有问题。我必须使我的C++代码具有与MATLAB相同的精度。在MATLAB中,我有一些脚本,它可以用数字来做一些事情。我在C++中得到了和那个脚本一样的代码。相同输入上的输出不同:我发现在我的脚本中,当我尝试104>104时,它返回false。我试图使用格式长,但是它没有帮助我找出它为什么是假的。这两个数字都是双的。我认为Matlab存储了104的实数值,它的真正值是103.9999。所以我把C++的精度提高了。ATC++返回C++中的50值,得到高精度的50.050值,这2个值来自于

我对精确性有问题。我必须使我的C++代码具有与MATLAB相同的精度。在MATLAB中,我有一些脚本,它可以用数字来做一些事情。我在C++中得到了和那个脚本一样的代码。相同输入上的输出不同:我发现在我的脚本中,当我尝试104>104时,它返回false。我试图使用格式长,但是它没有帮助我找出它为什么是假的。这两个数字都是双的。我认为Matlab存储了104的实数值,它的真正值是103.9999。所以我把C++的精度提高了。ATC++返回C++中的50值,得到高精度的50.050值,这2个值来自于像+或*这样的计算,有没有办法使我的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  
i=1时的
:邻居
y=spoints(i,1)+origy;
x=spoints(i,2)+origx;
%计算x和y方向的楼板、天花板和圆角。
fy=地板(y);cy=天花板(y);ry=圆形(y);
fx=地板(x);cx=天花板(x);rx=圆形(x);
%检查是否需要插值。
如果(abs(x-rx)<1e-6)和&(abs(y-ry)<1e-6)
%不需要插值,请使用原始数据类型
N=图像(ry:ry+dy,rx:rx+dx);
D=N>=C;
其他的
%如果需要插值,请使用双类型图像
ty=y-fy;
tx=x-fx;
%计算插值权重。
w1=(1-tx)*(1-ty);
w2=tx*(1-ty);
w3=(1-tx)*ty;
w4=tx*ty;
%计算插值像素值
N=w1*d_图像(fy:fy+dy,fx:fx+dx)+w2*d_图像(fy:fy+dy,cx:cx+dx)+。。。
w3*d_图像(cy:cy+dy,fx:fx+dx)+w4*d_图像(cy:cy+dy,cx:cx+dx);
D=N>=D_C;
结束
我在第12行的其他地方遇到了问题。tx和ty eqauls为0.707106781186547或1-0.707106781186547。来自d_图像的值在0和255之间。N是从图像插值4个像素的值0..255。d_C是值0.255。仍然不知道为什么matlab会显示,当我在N个值中,如:x x x 140.0000 140.0000和在d_C:x 140 x.d中我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;
}
int代码::插值(点、点、中心、Mat*Mat)
{
int x=中心点x-点x;
int y=中心y点y;
我的观点;

如果(xMatlab使用双精度,您可以使用C++的双精度类型。这将使大多数情况相似,但不是100%。
正如其他人所指出的,这可能不是问题的根源,或者在算法上有区别,或者它可能像Matlab和C++中定义的库函数不同。例如,MATLAB的STD()被(n-1)除以你的代码可以除以n。

Matlab使用双精度。你可以使用C++的双精度类型。这会使大多数事情相似,但不是100%。
正如其他人所指出的,这可能不是问题的根源,或者在算法上有区别,或者它可能像Matlab和C++中定义的库函数不同。例如,MATLAB的STD()被(n-1)除以您的代码可能会被n除。

首先,根据经验,直接比较浮点变量从来不是一个好主意。例如,您应该使用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*d
d=i/3.*d
将给出更准确的结果

上述例子不会在Matlab中造成任何问题,因为默认情况下所有的东西都已经是浮点数,所以类似的问题可能是C++和MATLAB代码结果的差异。 查看您的计算结果将有助于找出错误所在

编辑: 在C和C++中,如果你把一个双数值和一个相同的值进行比较,你就有很高的几率不相等。这两个双倍的情况是一样的,但是如果你对它们进行精确的计算,你可能会很幸运。即使在Matlab,它也是危险的,也许你只是幸运,因为两者都是双倍的,所以都被截断了。以同样的方式。 你最近的编辑看来,问题在于你对数组的评价。在C++中比较浮点或双倍(或者使用浮点变量时,在任何语言中)都不应该使用= =或O.=。比较的正确方法是检查它们是否在一个很小的距离内。
举个例子:使用==或!=比较两个double就像通过计算两个对象中原子的数量来比较两个对象的重量,并确定它们之间即使有一个原子的差异也不相等。

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

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

例如,我猜您的代码中存在一些强制转换问题

int i;
double d;
// ...
d = i/3 * d;
将给出一个非常不准确的结果,因为您有一个整数除法。
d=(double)i/3*d
d=i/3.*d
将给出