Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;当矩阵大小超过特征矩阵类型的特定限制时,分配错误 在C++动态库中用最小二乘法求解最小二乘问题。此Dll在解决配置问题的python软件中调用。在小问题中,代码正常工作并返回正确的解决方案。如果点数增加,则库抛出std::bad_alloc_C++_Matrix_Eigen - Fatal编程技术网

c++;当矩阵大小超过特征矩阵类型的特定限制时,分配错误 在C++动态库中用最小二乘法求解最小二乘问题。此Dll在解决配置问题的python软件中调用。在小问题中,代码正常工作并返回正确的解决方案。如果点数增加,则库抛出std::bad_alloc

c++;当矩阵大小超过特征矩阵类型的特定限制时,分配错误 在C++动态库中用最小二乘法求解最小二乘问题。此Dll在解决配置问题的python软件中调用。在小问题中,代码正常工作并返回正确的解决方案。如果点数增加,则库抛出std::bad_alloc,c++,matrix,eigen,C++,Matrix,Eigen,更准确地说,产生错误的代码被简化为 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) {

更准确地说,产生错误的代码被简化为

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;
}

其中,
b项
是布尔向量。因此,由于在循环中我们检查
如果(b项[k]==1)
第二个索引总是小于
nvalidtuple
,,从问题的细节来看,矩阵占用480Mb的RAM。32位应用程序只能访问2Gb的RAM(参见示例);分配失败,因为应用程序的地址空间中没有可用的连续480Mb块


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

只是为了确保:您是以64位进行编译的,对吗?不,我是以32位进行编译的。那么,您的15G可用内存中的大部分将是无用的,您的应用程序只能使用2GB(或者是3位?)。作为旁注…我觉得这就是问题所在。因为矩阵的大小接近2GB?如果我以64位编译,库是否仍能在32位机器上工作?
NvalidBtuple = 0;
for (int i=0;i<btermSize;++i) {NvalidBtuple += bterm[i];}