Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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
Python 用LAPACK进行奇异值分解:大矩阵问题_Python_C++_Lapack_Svd_Lapacke - Fatal编程技术网

Python 用LAPACK进行奇异值分解:大矩阵问题

Python 用LAPACK进行奇异值分解:大矩阵问题,python,c++,lapack,svd,lapacke,Python,C++,Lapack,Svd,Lapacke,我使用LAPACK的C接口来计算矩阵的奇异值分解(SVD)。为此,我正在使用例程dgesvd\uu 我创建了一个简单的C++脚本,它创建了一个随机矩阵(带有 M< /Cord>行和 N< /代码>列),并计算其SVD。此脚本的代码如下所示: #include <iostream> #include <random> #include "lapacke.h" #define M 150 #define N 3 #define MEAN 0 #define STD 0.25

我使用LAPACK的C接口来计算矩阵的奇异值分解(SVD)。为此,我正在使用例程
dgesvd\uu

我创建了一个简单的C++脚本,它创建了一个随机矩阵(带有<代码> M< /Cord>行和<代码> N< /代码>列),并计算其SVD。此脚本的代码如下所示:

#include <iostream>
#include <random>
#include "lapacke.h"

#define M 150
#define N 3
#define MEAN 0
#define STD 0.25


int main(int argc, char *argv[])
{

    std::default_random_engine generator;
    std::normal_distribution<double> distribution(MEAN, STD);

    int m = M, n = N, lda = M, ldu = M, ldvt = N, info, lwork;
    double wkopt;
    double* work;
    double s[n], u[ldu * m], vt[ldvt * n], a[lda * n];

    for(unsigned int k = 0; k < (lda * n); k++){
        a[k] = distribution(generator);
    }

    lwork = -1;
    dgesvd_("All", "All", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, &info);
    lwork = (int)wkopt;
    work = (double*) malloc(lwork * sizeof(double));
    dgesvd_("All", "All", &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, &info);  

    if(info > 0){
        std::cerr<< "The algorithm computing SVD failed to converge\n"     ;
        exit(1);
    }

    free(work);

    std::cout<<"Singular values:\n";
    for(unsigned int k = 0; k < n; k++){
        std::cout<<s[k]<<" ";
    }
    std::cout<<"\n";
    return(0);
}
当我使用Python时,奇异值的计算似乎是正确的,没有任何错误,尽管我使用的NumPy方法是使用LAPACK例程
dgesdd_uu
执行的(我尝试了这一点,并引发了相同的错误)

有人知道为什么会发生这种错误吗?如能帮助解决此问题,我们将不胜感激。谢谢


Pd:我使用的是lapacke的3.6.0版和Ubuntu 16.04 LTS。

在堆上这样分配矩阵可以解决问题:

double* s = new double[n];
double* u = new double[ldu * m];
double* vt = new double[ldvt * n];
double* a = new double[lda * n];

如果你在C++编程,为什么你使用<代码> Malc C/代码>代替<代码> NeX[]/COD>,或者更好的是<代码> STD::向量< /代码>?特别是因为你没有为 MalOC/中包含正确的头文件,而且可能会丢失它的原型,这可能会导致很大的麻烦。尽管从技术上讲,你不是在C++中编程,因为你使用的不是C++(它是你所使用的编译器的扩展)。最后,你说的“引发错误”是什么意思?什么错误?从哪里来?请花一些时间来解决。分段错误是崩溃,意味着您可能在内存或指针方面出错。如果在调试器中运行,那么崩溃发生在代码的何处?此外,指向内存的指针也是指向内存的指针。如果将一个函数传递给C函数,它指向的内存不必分配给
malloc
。您正在堆栈上分配大型结构,例如
u[ldu*M]
8*1500*1500=18MB
。您应该避免这种情况,而是在堆上分配
u
double* s = new double[n];
double* u = new double[ldu * m];
double* vt = new double[ldvt * n];
double* a = new double[lda * n];