QR算法实现3x3定点

时间:2015-03-01 20:57:58

标签: c embedded linear-algebra fixed-point cortex-m

我想找到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新手在这里....

code

1 个答案:

答案 0 :(得分:0)

我已经使用了很多年并且有多种好处LAPACK library

要比较结果,您可以使用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