C ++乘以大矩阵

时间:2013-10-28 03:46:08

标签: c++ matrix eigen

我正在从事物理学研究,因为我必须使用c ++将大型矩阵乘以348x348。我的老师让我用较小的矩阵测试我的代码,例如6x6和12x12以及那些矩阵,我得到了我正在寻找的东西。但是,当我尝试为348x348情况使用相同的精确代码时,我没有得到正确的矩阵乘法输出。我有程序读取一些数据并将数据作为矩阵,我已检查以确保所有数据都已正确读取。但是,我仍然没有得到正确的矩阵产品。我正在使用c ++库Eigen,我正在读取矩阵元素的数字作为双精度数。我的老师用她自己的程序完成了计算,她得到了正确的结果。所以,我只是想知道是否有人可以指出我正确的方向来找出问题所在?

myOutfile << NormCoord.transpose() * SqrtMass * NormCoord << endl;

这是实际的乘法。我应该得到单位矩阵,但是对于较大的矩阵,对角线元素偏离了2倍,并且当我希望它们至少为0时,一些非对角线元素在0.0001的数量级上有点过大。 10 ^( - 6)

的顺序

1 个答案:

答案 0 :(得分:0)

我的猜测:问题在于矩阵数据保存到文件中。

如果您将double保存到这样的文件中,请参阅:

double d=...;
out_file<<d;

然后稍后从文件中读取它:

in_file>>d;

您没有获得相同的数字。双写在写入时被截断,您只得到近似数字(我可能会添加一个重大错误)

打印矩阵时,您将无法看到错误,因为数字会在您不打印的位置被截断。但是,当您将数据乘以348x348的矩阵时 - 误差乘以因子348 * 2 = 696,使其足够大,可以看到。

printf/scanf相同。

解决方案?当你写数据时添加精度:

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

(除了“很多”之外我没有任何理由放20个。也许你需要更多或更少 - 我不确定双打的精确度是多少)

或者更好 - 如果可以的话,保存二进制数据。

修改:在printf中执行此操作:

printf("%.20lf",d);