计算矩阵最大特征值

来源:互联网 发布:java spring 代理模式 编辑:程序博客网 时间:2024/04/29 13:22

本文所采用的是幂算法计算矩阵最大特征值(只计算最大特征值),具体的细节可以参考:http://blog.csdn.net/whucv/article/details/7636135

这儿只给出伪代码和源码,方便各位同学使用。
假设待计算的矩阵为A[N][N],一个N维的方阵.
申明一个辅助向量(一维数组)v[N].并初始化
//对应函数InitialV()
for i=1:n
     v[i]=1
end


然后进行不停的迭代,当迭代的次数趋于无穷时,max的值越接近于真实的最大特征值。
在实际中,可以考察前后两次迭代的值的差距,如果该差距在可以接受的范围内(比如0.00001),则可以结束迭代
迭代过程:
while(true)
  1.v=matrix * v; // 对应函数ComputeNewV()
  2.max=v(1:n);   // 对应函数GetMaxV();
  3.v=v/max;      // 对应函数NormalizeV();
end
解释:
1.矩阵相乘。用matrix和v向量进行相乘,结果保存在v中。相乘的过程和矩阵乘法一样(需要假象将v倒置)
2.获取上一步后产生的最大v值,记为max(即一维数组v中的最大值),用该值去除原向量v,保证v数组的元素值不超过1.(注,在除法前所获得的max值才是我们的特征估计值)


循环迭代上述过程,直到前后两次的估计值(max)在我们的误差范围内,结束迭代。


// Matrix.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<math.h>using namespace std;#define N 3//行列 NxN方阵 #define e 0.0000001//误差限double matrix[N][N];double vector[N];void ComputeNewV();double GetMaxV();void NormalizeV();void InitialV();int main(){///初始化待求矩阵matrix[0][0]=1.0;matrix[0][1]=1.0;matrix[0][2]=0.5;matrix[1][0]=1.0;matrix[1][1]=1.0;matrix[1][2]=0.25;matrix[2][0]=0.5;matrix[2][1]=0.25;matrix[2][2]=2.0;InitialV();///分别记录上一次和这一次的迭代值,即我们需要的最大特征值    ///当误差连续K次小于一个范围时,便结束迭代///关于这一点我也不太确定,没仔细阅读教材///一个可行的办法是根据可以接受的时间直接迭代10000次甚至更高double lastValue;double currentValue=0.0;int k=0;for(int i=0;i<10000;i++){ComputeNewV();lastValue=currentValue;currentValue=GetMaxV();if(abs(currentValue-lastValue)<e)k++;elsek=0;if(k>10)break;NormalizeV();}cout<<"wanted:"<<currentValue<<endl;return 0;}///初始化向量,可以赋予非0任何值void InitialV(){for(int i=0;i<N;i++)vector[i]=1.0;}///迭代计算vector=matrix*vectorvoid ComputeNewV(){double temp[N];//申明临时变量存储结果for(int i=0; i<N; i++){temp[i]=0.0;for(int j=0;j<N;j++)temp[i]+=matrix[i][j]*vector[j];}///拷贝结果到vector向量for(int i=0;i<N;i++)vector[i]=temp[i];}///获取向量vector的最大值,也是这次迭代之后的一个最大特征估计值double GetMaxV(){double result=vector[0];for(int i=1;i<N;i++)if(vector[i]>result)result=vector[i];return result;}///用当前vector的最大值对向量做除法,归一化void NormalizeV(){double max=GetMaxV();for(int i=0;i<N;i++)vector[i]/=max;}


原创粉丝点击