C++;大矩阵乘法 我是一名本科生,从事物理研究,我必须用C++来把380×334的大矩阵乘以3+X448。我的老师让我用更小的矩阵测试我的代码,比如6x6和12x12,通过这些矩阵,我得到了我想要的东西。但是,当我尝试对348x348使用相同的精确代码时,我没有得到矩阵乘法的正确输出。我让程序读入一些数据并将数据作为矩阵,我已经检查以确保所有数据都被正确读入。但是,我仍然没有得到矩阵的正确乘积。我使用C++库Eigen,我在矩阵中的元素中读取数字作为双倍。我的老师用她自己的程序做了计算,她得到了正确的结果。所以,我只是想知道是否有人能为我指出正确的方向来找出问题所在 myOutfile << NormCoord.transpose() * SqrtMass * NormCoord << endl; myOutfile

C++;大矩阵乘法 我是一名本科生,从事物理研究,我必须用C++来把380×334的大矩阵乘以3+X448。我的老师让我用更小的矩阵测试我的代码,比如6x6和12x12,通过这些矩阵,我得到了我想要的东西。但是,当我尝试对348x348使用相同的精确代码时,我没有得到矩阵乘法的正确输出。我让程序读入一些数据并将数据作为矩阵,我已经检查以确保所有数据都被正确读入。但是,我仍然没有得到矩阵的正确乘积。我使用C++库Eigen,我在矩阵中的元素中读取数字作为双倍。我的老师用她自己的程序做了计算,她得到了正确的结果。所以,我只是想知道是否有人能为我指出正确的方向来找出问题所在 myOutfile << NormCoord.transpose() * SqrtMass * NormCoord << endl; myOutfile,c++,matrix,eigen,C++,Matrix,Eigen,我的猜测:问题是您将矩阵数据保存到文件的位置 请参见,如果将double保存到如下文件: double d=...; out_file<<d; in_file>>d; 您没有得到相同的号码。double在写入时被截断,您只能得到近似的数字(我可能会添加一个严重的错误) 当您打印矩阵时,您将无法看到错误,因为数字在您不打印的地方被截断。但是当你将数据乘以348x348的矩阵时,误差乘以348*2=696的系数,使得它足够大,可以看到 与printf/scanf相同 解决

我的猜测:问题是您将矩阵数据保存到文件的位置

请参见,如果将
double
保存到如下文件:

double d=...;
out_file<<d;
in_file>>d;
您没有得到相同的号码。double在写入时被截断,您只能得到近似的数字(我可能会添加一个严重的错误)

当您打印矩阵时,您将无法看到错误,因为数字在您不打印的地方被截断。但是当你将数据乘以348x348的矩阵时,误差乘以348*2=696的系数,使得它足够大,可以看到

printf/scanf
相同

解决方案是什么?写入数据时,请添加精度:

out_file<<std::setprecision(20)<<d; // need to #include<iomanip>

我们可能可以,但前提是您至少发布一些代码。没有看到你做了什么,任何人都会猜测你做错了什么。发布代码会有帮助,没有代码就不可能知道问题出在哪里。我应该发布代码的哪一部分?这是一个非常简单的代码,因为Eigen使处理矩阵变得非常简单,就像我说的,当使用较小的矩阵时,我得到了正确的输出;你忘了写,他也可以把二进制数据编码成文本(例如,
base64
encoding)然后写。
printf("%.20lf",d);