当矩阵大小超过特定矩阵类型

时间:2015-10-27 10:10:08

标签: c++ matrix eigen

在c ++动态库中,我使用Eigen Library解决了最小二乘问题。这个Dll在python软件中被调用,其中问题配置已经解决。在一个小问题中,代码正常工作并返回正确的解决方案。如果点数增加,则库会抛出std::bad_alloc

更确切地说,创建错误最简化的代码是

try {
    matrixA = new Eigen::MatrixXd(sizeX,NvalidBtuple); // initialize A
    for (int i=0;i<sizeX;++i) {
        int secondIndex = 0;
        for (int k=0;k<btermSize;++k) {
            if (bterm[k] == 1) {                        // select btuple that are validated by density exclusion
                // product of terms
                (*matrixA)(i,secondIndex) = 1.0;
                secondIndex += 1;
            }
        }
    }
} catch (std::bad_alloc& e) {
    errorString = "Error 3: bad allocation in computation of coefficients!";
    std::cout<<errorString<<" "<<e.what()<<std::endl;
    return;
} catch (...) {
    errorString = "Error 4: construction of matrix A failed! Unknown error.";
    std::cout<<errorString<<std::endl;
    return;
}

其中matrixA在头文件中使用Eigen::MatrixXd *matrixA;定义。

如果sizeXNvalidBtuple小于约20'000x3'000,则矩阵定义有效。如果尺寸较大,则会崩溃。

我进行测试的计算机有足够的可用内存,大约15G的可用内存。

这是堆/堆栈问题吗? 如何让库接受更大的矩阵?

任何评论都是欢迎。感谢。

修改 正如下面的答案所述,我对NvalidBtuple定义不清楚:

NvalidBtuple = 0;
for (int i=0;i<btermSize;++i) {NvalidBtuple += bterm[i];}

其中bterm是布尔向量。因此,由于在循环中我们进行了检查if (bterm[k] == 1)secondIndex始终小于NvalidBtuple

1 个答案:

答案 0 :(得分:1)

根据您的问题的细节,矩阵需要480Mb的RAM。 32位应用程序只能访问2Gb的RAM(参见例如How much memory can a 32 bit process access on a 64 bit operating system?);分配失败,因为应用程序的地址空间中没有空闲的连续 480Mb块。

解决问题的最佳方法是将应用程序重新编译为64位。您无法在32位系统中运行它,但这不应该是一个问题,因为由于内存有限,您无法在此类系统上运行算法。