|
如题,我使用c++,在vs2022上,想要计算一个矩阵的svd分解,采用mkl的LAPACKE_dgesvd函数。但我发现一个问题,当我的矩阵大小为33*33时,可以正常计算出结果。但是矩阵为34*34时就会一直计算,没有结果。请问这是为什么?代码如下:(当n=33时能正常计算,n=34时计算不出结果)#include <iostream>
#include <mkl.h>
#include <vector>
#include <string>
void generate_symmetric_indefinite_matrix(double* A, int n) {
// 生成对角元素包含正负值的对角矩阵
for (int i = 0; i < n; ++i) {
A[i*n + i] = (i % 2 == 0) ? (i+1.0) : -(i+1.0); // 交替正负
}
// 添加对称非对角元素(保持对称性)
for (int i = 0; i < n; ++i) {
for (int j = i+1; j < n; ++j) {
double val = 0.1 * (i + j); // 小量非对角元素
A[i*n + j] = val;
A[j*n + i] = val;
}
}
}
int main() {
const lapack_int n = 34; // 矩阵大小!!!!!!
const lapack_int matrix_size = n * n;
// 动态分配矩阵内存(行主序)
std::vector<double> asd(matrix_size);
generate_symmetric_indefinite_matrix(asd.data(), n);
// 分配SVD输出空间
std::vector<double> s(n); // 奇异值
std::vector<double> U(n * n); // 左奇异向量
std::vector<double> VT(n * n); // 右奇异向量转置
std::vector<double> superb(n - 1); // 工作空间
// 调用LAPACKE_dgesvd进行SVD分解
lapack_int info = LAPACKE_dgesvd(
LAPACK_ROW_MAJOR, // 行主序存储
'A', // 计算全部左奇异向量
'A', // 计算全部右奇异向量
n, // 矩阵行数
n, // 矩阵列数
asd.data(), // 矩阵数据指针
n, // 行主序的leading dimension(列数)
s.data(), // 奇异值输出
U.data(), // 左奇异向量矩阵
n, // U的leading dimension
VT.data(), // 右奇异向量转置矩阵
n, // VT的leading dimension
superb.data() // 超对角线工作空间
);
}
|
|