Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拉帕克函数对角化所需的全矩阵或三角部分? 我想计算对称矩阵的特征值,并希望在C++中使用英特尔MKL库中的LAPACKEY-DYSIV函数。但对于矩阵需要以何种形式传递,我有点困惑_C++_Lapack_Intel Mkl - Fatal编程技术网

拉帕克函数对角化所需的全矩阵或三角部分? 我想计算对称矩阵的特征值,并希望在C++中使用英特尔MKL库中的LAPACKEY-DYSIV函数。但对于矩阵需要以何种形式传递,我有点困惑

拉帕克函数对角化所需的全矩阵或三角部分? 我想计算对称矩阵的特征值,并希望在C++中使用英特尔MKL库中的LAPACKEY-DYSIV函数。但对于矩阵需要以何种形式传递,我有点困惑,c++,lapack,intel-mkl,C++,Lapack,Intel Mkl,从文档中,我得出结论,我只需要通过矩阵的上/下三角部分。它在这里提到了一个论点,即它“是一个数组,包含对称矩阵A的上三角部分或下三角部分”。然而,实际上似乎需要将指向完整矩阵的指针传递给例程 假设我想对下列矩阵进行对角化: [[-2, 0, 0.5, 0], [0, 0.5, -2, 0.5], [0.5, -2, 0.5, 0], [0, 0.5, 0, -1]], 其特征值为[2.56,-2.22,-1.53,-0.81]

从文档中,我得出结论,我只需要通过矩阵的上/下三角部分。它在这里提到了一个论点,即它“是一个数组,包含对称矩阵A的上三角部分或下三角部分”。然而,实际上似乎需要将指向完整矩阵的指针传递给例程

假设我想对下列矩阵进行对角化:


[[-2,   0,     0.5,  0], 
[0,     0.5, -2,     0.5], 
[0.5,  -2,    0.5,  0], 
[0,     0.5,  0,    -1]], 
其特征值为[2.56,-2.22,-1.53,-0.81]
然后在下面的代码中,只有第一个选项给出正确的值

#包括
#包括“mkl_lapacke.h”
使用名称空间std;
int main(){
MKL_INT N=4;
//使用全矩阵
双矩阵_ex_full[16]={-2,0,0.5,0,0,0.5,-2,0.5,0.5,-2,0.5,0,0,0.5,0,-1};
双值全[4];
MKL_INT test1=LAPACKE_dsyev(LAPACK_ROW_MAJOR,'N','U',N,矩阵_ex_full,N,evals_full);
cout根据,似乎
LAPACKE\u dsyev
要求在完全存储方案中存储上三角部分或下三角部分。甚至有文档说,参数
a
应该是一个大小为
max(1,lda*n)
的数组,在您的情况下是16

当我切换到矩阵的这个定义时:

double matrix_ex_uppertri[16] =
   { -2.0,  0.0,  0.5,  0.0,
      0.0,  0.5, -2.0,  0.5,
      0.0,  0.0,  0.5,  0.0,
      0.0,  0.0,  0.0, -1.0 };
然后,我得到了正确的特征值

需要承认文档在这里有很大的误导性。不理解为什么他们没有明确指定存储方案。

根据,字母
sy
以函数
dsyev()的名义
表示对称矩阵,而字母
d
表示双精度,
ev
表示特征值。然而,格式
sy
对应于与矩阵形状一致的二维数组。根据值,可以使用上三角部分或下三角部分e参数UPLO

要使用压缩格式,请查看函数,其中字母
sp
对应。LAPACKE函数为C提供了一个方便的接口

下面是由
g++main.cpp-o main-llapacke-llapack-lblas-lm-Wall编译的示例代码

#include <iostream>
#include <math.h>

extern "C" { 
#include <lapacke.h>
}

using namespace std;

int main(int argc, char *argv[])
{
    lapack_int N = 4;
    // use full matrix
    double matrix_ex_full[16] = {-2,0,0.5,0,    0,0.5,-2,0.7,    0.5, -2, 0.5, 0,     0,0.7,0,-1};
    double evals_full[4];
    lapack_int test1 = LAPACKE_dsyev(LAPACK_ROW_MAJOR, 'N', 'U', N, matrix_ex_full,N, evals_full);
    cout << "success = " <<test1 << endl;
    for (int i = 0;i<4;i++)
        cout << evals_full[i] << endl;
    // use upper triagonal only
    double matrix_ex_uppertri[10] = {-2, 0, 0.5, 0,    0.5, -2, 0.7,    0.5, 0,   -1};
    double evals_uppertri[4];


    int test2 = LAPACKE_dspev(LAPACK_COL_MAJOR, 'N', 'L', N, matrix_ex_uppertri, evals_uppertri,NULL,N);
    cout << "success = " <<test2 << endl;
    for (int i = 0;i<4;i++)
        cout << evals_uppertri[i] << endl;
    return 0;
}
#包括
#包括
外部“C”{
#包括
}
使用名称空间std;
int main(int argc,char*argv[])
{
lapack_int N=4;
//使用全矩阵
双矩阵_ex_full[16]={-2,0,0.5,0,0.5,-2,0.7,0.5,-2,0.5,0,0.7,0,-1};
双值全[4];
lapack_int test1=lapack_dsyev(lapack_行_大调,'N','U',N,矩阵_ex_full,N,evals_full);

代码的输出是什么?好的,我明白了,非常感谢您的澄清,这是有意义的!