C++ 中的分段错误(特征库)

Posted

技术标签:

【中文标题】C++ 中的分段错误(特征库)【英文标题】:Segmentation Fault in C++ (Eigen library) 【发布时间】:2018-07-17 11:38:57 【问题描述】:

我正在尝试使用特征库来确定超定线性系统的最小二乘解。

当矩阵大小很大时,代码会出现分段错误,例如 6000 行,如下面的程序所示。当 rows = 5000 时,相同的程序正在运行。我阅读了很多关于修复分段错误的帖子,但我找不到任何有用的东西。

#include <cstdlib>
#include <iostream>
#include <Eigen/Dense>
#include <complex>
#define cols 45
#define rows 6000

using namespace Eigen;

int main() 
    int i,j;
    Matrix<std::complex<double>, rows,cols> zMat;

    for(i=0;i<rows;i++) 
        for(j=0;j<cols;j++) 
            zMat(i,j)=std::complex<double>(rand(),rand());
        
    

    VectorXcd ampIn(rows);
    for(i=0;i<rows;i++)
        ampIn(i)=std::complex<double>(rand(),rand());

    //Solving Matrix equation using QR Decomposition
    VectorXcd solution = zMat.colPivHouseholderQr().solve(ampIn);

    std::cout << "The least-squares solution is:\n" << solution << std::endl;

    return 0;

【问题讨论】:

您的计算机将有其内存大小的上限,您可能正在推动这个。 根据Matrix 的实现,所有数据都可以与对象一起存储在堆栈中。堆栈是编译器通常放置局部变量和参数的地方,并且是非常有限的资源。在 Windows 上,默认堆栈大小为 1MiB,在 Linux 上为 8MiB。 45*6000*2*8(复杂对象为 2*8)超过 2MiB,远远超过 Windows 的限制。 如果@Someprogrammerdude 的假设是正确的,一个简单的解决方法是使用unique_ptr&lt;Matrix&lt;...&gt;&gt;make_unique,而不是Matrix&lt;...&gt;。然后 Matrix 对象的分配将来自堆。 对大于 1 MB 的数据使用 MatrixXcd 而不是 Matrix @mrNAE 解决了我的问题,非常感谢! 【参考方案1】:

对于特征库,对于大于 1 MB 的数据,使用 MatrixXcd 而不是 Matrix&lt;std::complex&lt;double&gt;...

【讨论】:

通常,即使只有几 kB,也不值得使用固定大小的矩阵——但这很大程度上取决于目标架构和所完成的操作。

以上是关于C++ 中的分段错误(特征库)的主要内容,如果未能解决你的问题,请参考以下文章

C++:当我添加看似无关的代码行时,分段错误消失了

从堆栈跟踪中查找共享库中的源代码行

gcc,c++:静态字符串成员变量导致堆损坏/分段错误

C++ 分段错误 OpenCV

在 C++ 中使用向量时出现分段错误

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)