1346527897 发表于 2025-2-19 14:36:46

c++ mkl库计算矩阵svd分解问题

如题,我使用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 % 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 = val;
            A = 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()   // 超对角线工作空间
    );
}



页: [1]
查看完整版本: c++ mkl库计算矩阵svd分解问题