C++ 乘法大矩阵

Posted

技术标签:

【中文标题】C++ 乘法大矩阵【英文标题】:C++ Multiplying Large Matrices 【发布时间】:2013-10-28 03:46:07 【问题描述】:

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

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

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

【问题讨论】:

我们可能可以,但前提是您至少发布一些代码。没有看到你做了什么,任何人都猜测你做错了什么。 发布代码会有所帮助,没有代码就不可能知道问题所在。 我应该发布代码的哪一部分?这是一个非常简单的代码,仅仅是因为 Eigen 使得使用矩阵变得如此简单,就像我说的那样,当使用较小的矩阵时,我得到了正确的输出。 发布您认为相关的部分 const int NUMBER_OF_COORDINATES = 348; 【参考方案1】:

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

看,如果你将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);

【讨论】:

你忘了写,他也可以将二进制数据编码成文本(例如base64编码)然后写。

以上是关于C++ 乘法大矩阵的主要内容,如果未能解决你的问题,请参考以下文章

矩阵乘法性能 numpy 和 eigen c++

c++实现矩阵乘法

稀疏矩阵与密集矩阵乘法 C++ Tensorflow

C++ 利用硬件加速矩阵乘法

大矩阵的Opencv乘法

OpenGL矩阵乘法C++