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