拉帕克函数对角化所需的全矩阵或三角部分? 我想计算对称矩阵的特征值,并希望在C++中使用英特尔MKL库中的LAPACKEY-DYSIV函数。但对于矩阵需要以何种形式传递,我有点困惑
从文档中,我得出结论,我只需要通过矩阵的上/下三角部分。它在这里提到了一个论点,即它“是一个数组,包含对称矩阵A的上三角部分或下三角部分”。然而,实际上似乎需要将指向完整矩阵的指针传递给例程 假设我想对下列矩阵进行对角化:拉帕克函数对角化所需的全矩阵或三角部分? 我想计算对称矩阵的特征值,并希望在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]
[[-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);
代码的输出是什么?好的,我明白了,非常感谢您的澄清,这是有意义的!