Fortran Coder

标题: c++ mkl库计算矩阵svd分解问题 [打印本页]

作者: 1346527897    时间: 3 天前
标题: 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*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()     // 超对角线工作空间
    );
}








欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2