计算矩阵最大特征值

本文所采用的是幂算法计算矩阵最大特征值(只计算最大特征值),具体的细节可以参考: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
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)10)
			break;
		NormalizeV();	
	}
	cout<<"wanted:"<result)
			result=vector[i];

	return result;
}

///用当前vector的最大值对向量做除法,归一化
void NormalizeV()
{
	double max=GetMaxV();
	for(int i=0;i


你可能感兴趣的:(算法)