如何访问 Magma Routine 的结果

问题描述 投票:0回答:0

我正在尝试使用

magma_sgeev
例程访问一般实矩阵的特征值分解的结果。我的代码如下-

#include <cstdlib>
#include <iostream>
#include <map>

#include <typeindex>
#include <typeinfo>

#include <magma_v2.h>
#include <random>

#define N 10
#define LDA N
#define LDVL N
#define LDVR N

/* Main program */
int main()
{
    magma_init();
    /* Locals */
    int n = N, lda = LDA, ldvl = LDVL, ldvr = LDVR, info, lwork;
    float wkopt;
    float *work;
    /* Local arrays */
    float wr[N], wi[N], vl[LDVL * N], vr[LDVR * N];
    float *a = (float *)malloc(LDA * N * sizeof(float));
    for (int i = 0; i < LDA * N; i++)
        a[i] = rand();
    printf("Done populating matrix\n");

    lwork = -1;
    magma_sgeev_m(MagmaNoVec, MagmaNoVec, n, a, lda, wr, wi, vl, ldvl, vr, ldvr,
                  work, lwork, &info);

    lwork = (int)work[0];
    work = (float *)malloc(lwork * sizeof(float));
    printf("%d\n", lwork);

    magma_sgeev_m(MagmaNoVec, MagmaNoVec, n, a, lda, wr, wi, vl, ldvl, vr, ldvr,
                  work, lwork, &info);

    for (int i = 0; i < N; i++)
        printf("%f ", wr[i]);

    std::cout << std::endl;

    for (int i = 0; i < N; i++)
        printf("%f ", wi[i]);

    printf("\n");

    if (info > 0)
    {
        printf("The algorithm failed to compute eigenvalues.\n");
        exit(1);
    }
    exit(0);

    magma_finalize();
}

如文档所述,数组

wr
wi
保存计算结果。但是,这段代码有两个问题,

  • 当我尝试访问

    wr
    wi
    时,出现分段错误。我不知道 magma 图书馆的内部运作,我错过了什么,我该如何解决?

  • 当我增加矩阵的大小时,例如从

    5x5
    10x10
    。我在
    magma_sgeev
    本身的第一次调用中遇到分段错误。我错过了什么

TIA

lapack blas magma
© www.soinside.com 2019 - 2024. All rights reserved.