c-QR算法实现3x3不动点



我想找到3x3矩阵的特征值和特征向量(大多数情况下,如果不总是对称的话!!)。我的数字以定点格式存储(准确地说是16.16)。

请注意,我并不太在意性能,只是简单地实现一个完成任务的算法。

当您构建并运行它(使用libfixmath库)时,下面的代码会生成正确的特征值,但不会生成正确的本征向量。

如果我正确理解算法,特征向量是所有计算出的Q的乘积。

有人知道可能出了什么问题吗?(甚至是对代码(写作风格等)的更正——你能想到的任何东西,但当然要试着把注意力集中在特征向量上!:):P

实际的循环就像3行。。。它的作用是:

eigenvectors = identity matrix
1) QR decomposition A = Q*R
2) Anew = R*Q (multiply the factors in the reverse order, and iterate)
3) eigenvectors = eigenvectors * Q

谢谢!!哦,这里的C新手。。。。

代码:

我已经使用了很多年,有几个好处LAPACK库,

为了比较结果,您可以使用R(默认使用LINPACK例程DQRDC2)甚至MATLAB。

然后,您可以使用R中的qr()命令和LAPACK=TRUE选项来使用LAPACK例程:

> QR <- qr(Mat,LAPACK=TRUE)
> QR

但是,您应该注意,在这种情况下,函数qr()使用LAPACK例程DGEQP3。与您使用的DGEQRF例程相反,DGEQP3计算具有列枢轴的矩阵的QR分解。

如果你得到不同的结果,可能是你没有使用相同的方法(不知道什么方法使用了你发布的代码)。

您应该记住,QR分解是而不是唯一的解决方案。要知道你的QR分解是否正确,你可以简单地检查Q和R矩阵是否满足要求。例如在R:中

> Q <- qr.Q(QR)
> round( t(Q) %*% Q , 10 )
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1
> all.equal(Q %*% qr.R(QR),Mat)
[1] TRUE

相关内容

  • 没有找到相关文章

最新更新