我正在尝试编写代码来计算对称矩阵的eign向量和eign值。我理解如何使用pen& amp计算evalues。纸,但我与api稍有混淆!我是初学者,所以我在解释api参数时可能会出错。
int main() {
char jobz='V',uplo='U';
int lda=3,n=3,info=8,lwork=9;
// lapack_int lda=3,n=3,info=8;
int i;
double w[3],work[3];
double a[9] = {
3,2,4,
2,0,2,
4,2,3
};
info=LAPACKE_dsyev(LAPACK_ROW_MAJOR,jobz,uplo, n ,a, lda , w);
//dsyev_( &jobz,&uplo,&n, a, &lda, w,work , &lwork, &info );
if( info > 0 ) {
printf( "The algorithm failed to compute eigenvalues.\n" );
exit( 1 );
}
for(i=0;i<3;i++)
{
printf("%f\n",w[i]);
}
for(i=0;i<9;i++)
{
printf("%f\n",a[i]);
}
exit( 0 );
}
输出: 的 -1.000000 -1.000000 8.000000
0.617945 1.999713 -0.016938 0.010468 0.033876 0.999857 1.381966 0.618034 0.000000
而我在输出的某个地方预期k=-1: [1,-2,0] ,[4,2,-5] and k=8: [2,1,2]!
我是否错误地使用api或者我是否正确地读取输出? 还请建议我如何使用fortran api执行相同的任务? 和fortran一样,我无法获得适当的价值! 即我用fortran获得的价值: -0.134742 0.050742 0.523036
eign载体: 0.617945 1.999713 -0.016938 0.010468 0.033876 0.999857 1.381966 0.618034 0.000000
答案 0 :(得分:3)
正如@francis在评论中所建议的那样,如果您将work[3]
修改为work[9]
,该程序仍可正常运行。获得的结果是
Eigenvalues: w[0],w[1],w[2] => -1.000000 -1.000000 8.000000
1st eigenvector: a[0], a[1], a[2] => -0.494101 -0.472019 0.730111
2nd eigenvector: a[3], a[4], a[5] => -0.558050 0.816142 0.149979
3rd eigenvector: a[6], a[7], a[8] => 0.666667 0.333333 0.666667
为了比较,让我们用不同的程序对同一矩阵进行对角化。例如,Python / Numpy给出了结果
>>> import numpy as np
>>> a = np.array([[3,2,4], [2,0,2], [4,2,3]], dtype=np.float )
>>> np.linalg.eig( a )
(array([-1., 8., -1.]),
array([[-0.74535599, 0.66666667, -0.09414024],
[ 0.2981424 , 0.33333333, -0.84960833],
[ 0.59628479, 0.66666667, 0.5189444 ]]))
而朱莉娅给出了
julia> a = Float64[ 3 2 4 ; 2 0 2 ; 4 2 3 ]
3x3 Array{Float64,2}:
3.0 2.0 4.0
2.0 0.0 2.0
4.0 2.0 3.0
julia> eig( a )
([-0.9999999999999996,-0.9999999999999947,8.0],
3x3 Array{Float64,2}:
0.447214 -0.596285 -0.666667
-0.894427 -0.298142 -0.333333
0.0 0.745356 -0.666667)
在这两种情况下,前三个数字都是特征值{-1,-1,8}
,后面的矩阵是相应的特征向量(在它们的列中)。您将看到所有程序为特征向量提供不同的结果。因为有两个退化特征值(-1),相应特征向量的任何线性组合也是具有相同eivenvalue的特征向量,因此结果不是唯一的。我们可以确认从C获得的简并特征向量通过2x2正交变换(或“旋转”101.6度)与Julia的特征向量相关。
有趣的是,您的预期特征向量[-1,2,0]
和[4,2,-5]
完全对应于从Julia(归一化后)获得的特征向量,但这可能是偶然的,人们不能期望退化特征向量的这种一致性。