LAPACK计算特征向量失败
LAPACK fails calculating eigenvectors
我写了一些代码来解决一般的特征值问题,现在我将我的结果与LAPACK的DSPGVX
函数进行比较。我刚刚用了这个例子。
所以我得到了4个自动矢量
{
{-0.0319133, -0.265466, -0.713483, 0.64765},
{-0.425628, -0.520961, -0.714215, 0.193227},
{ 0.32702, 0.565845, -0.37129, -0.659561},
{-0.682699, -0.056645, 0.0771025, 0.724409}
}
和自动值
{-2.22545, 1.12704, -0.454756, 0.100076}
我的代码和Mathematica的结果都是一致的。
但在上一个链接中,从LAPACK报告的自动矢量完全不同。
Eigenvalues
-0.4548 0.1001
Selected eigenvectors
1 2
1 0.3080 0.4469
2 0.5329 0.0371
3 -0.3496 -0.0505
4 -0.6211 -0.4743
我应该信任谁?
附言:我还检查了我的自动值/自动向量是否正确,因为它们产生A*x-lambda*B*x=0,而LAPACK的值则不正确。
我不知道你为什么认为LAPACK给出了错误的答案,他们对我来说似乎很好。使用你引用的四位数小数,我得到残差(r=A*x-lambda*B*x),这样
norm(r1)=1.5921e-04、norm(r2)=6.0842e-05。
由于范数(A)=1.2994和范数(B)=7.9874,这些残差看起来非常令人满意。
DSPGVX产生的特征向量被归一化,使得
范数(x'*B*x)=1。
看起来DSGPVX正在求解A*lambda=B*x*lambda;Matlab使用"eig"为您的问题提供DSGPVX解决方案,尽管Matlab的文档是正确的。我猜想这是DSGPVX文档中的一个错误。
>> a=[0.24 0.39 0.42 -0.16;0.39 -0.11 0.79 0.63;0.42 0.79 -0.25 0.48;-0.16 0.63 0.48 -0.03];
>> b=[4.16 -3.12 0.56 -0.1;-3.12 5.03 -0.83 1.09;0.56 -0.83 0.76 0.34;-0.1 1.09 0.34 1.18];
>> [v,d]=eig(a,b)
v =
-0.0690 0.3080 -0.4469 -0.5528
-0.5740 0.5329 -0.0371 -0.6766
-1.5428 -0.3496 0.0505 -0.9276
1.4004 -0.6211 0.4743 0.2510
d =
-2.2254 0 0 0
0 -0.4548 0 0
0 0 0.1001 0
0 0 0 1.1270
>> norm(a*v-b*v*d)
ans =
1.5001e-15
看起来Lapack的结果实际上对应于代码和Mathematica生成的最后两个特征值,尽管低阶比特的结果截然不同。相应的矢量非常接近,只是缩放不同而已。
很明显,如果你的/Mematica的值检查出来了,而Lapack的值没有检查出来,你应该相信那个能给出正确答案的人。调查一下你的问题是什么,以及Lapack的算法使它提供了非常不精确的答案,这可能是有价值的。
相关文章:
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 引用包装器的向量,push_back失败?
- 嵌套列表(字符串向量的向量)初始化失败
- C++ std::向量插入两个元素替代算法失败
- 为什么将此对向量< map< int,int>>中的地图进行更新.失败
- 使用ENABLE_IF和SFINAE时,功能参数类型扣除(std容器,例如向量)失败
- 测试用例大小为 10 的向量失败
- 向量初始化在 C++ 类中失败
- 与常量 std::string 的向量相关的编译失败
- 为什么引发此断言失败警报的向量
- 每当我输入长度为4的字符串时,下面的cpp代码就会崩溃(向量中的malloc失败)
- push_back包含向量的结构时失败
- 为什么将 cv::Mat 的列复制到向量中会失败
- 提升精神业力 - 具有约束和传播失败的字符串的输出向量
- 代码失败在向量的数据之前插入数字
- ViennaCL:矩阵向量积失败
- LAPACK计算特征向量失败
- c++向量排序方法编译失败,返回预期表达式
- deque的问题:map<...,deque<> >失败,但向量和列表不是?
- 将元素追加到向量会导致后续排序失败