0

我有一个 m * 3 的矩阵,其中 m >> 3,存储在行主要的一维数组 [xyzxyzxy z...] 中。我调用LAPACKE_dgesvd函数来获取矩阵的左奇异向量 U 的前 n 列,但它引发了异常。

我引用了这个页面:

英特尔 mkl 参考

这个页面提到如果我们只获取左左奇异向量的n列,我们可以让jobu为S,jobvt为N。在我的示例中,我只想获取U的前3列,所以我分配9你的数量,我这样调用函数:

/**************************
* data is a m * 3 matrix like [x y z x y z...]
* A = U*S*Vt
**************************/
const int n = 3;
std::unique_ptr<double[]> u = std::make_unique<double[]>(n * n);
std::unique_ptr<double[]> vt = std::make_unique<double[]>(n * n);
std::unique_ptr<double[]> s = std::make_unique<double[]>(n * n);
std::unique_ptr<double[]> superb = std::make_unique<double[]>(std::min(m, n));

LAPACKE_dgesvd(CblasRowMajor, 'S', 'N', m, n, data, 
            n, s.get(), u.get(), n, vt.get(), n, superb.get());

此代码引发异常。我猜原因是 u 和 vt 没有分配足够的内存。我的意思是,如果我只想获取 U 的子向量,但我必须用 m * m 分配 U 的全部内存,用 n * n 分配 vt?

4

0 回答 0