您的位置:首页 > 其它

计算矩阵最大特征值

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


这儿只给出伪代码和源码,方便各位同学使用。

假设待计算的矩阵为A

,一个N维的方阵.

申明一个辅助向量(一维数组)v
.并初始化

//对应函数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

;
double vector
;

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++;
else
k=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*vector
void ComputeNewV()
{
double temp
;//申明临时变量存储结果
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: