Fortran Coder

查看: 68|回复: 0
打印 上一主题 下一主题

[数学库] c++ mkl库计算矩阵svd分解问题

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
8 元
贡献
2 点
跳转到指定楼层
楼主
发表于 前天 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我使用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()     // 超对角线工作空间
    );
}



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-2-21 20:31

Powered by Tencent X3.4

© 2013-2025 Tencent

快速回复 返回顶部 返回列表