计算矩阵最大特征值
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; }
相关文章推荐
- 乘幂法计算矩阵绝对值最大特征值
- C语言调用MKL进行矩阵计算—特征值特征向量求解
- GPU上大规模稀疏矩阵特征值计算高效算法之二——稀疏矩阵
- 矩阵的缩放,最大特征值在单位圆上。。。。
- 计算一个矩阵从左上角到右下角和最大(DFS)
- 幂法求矩阵的最大特征值和对应特征向量
- 计算一个矩阵从左上角到右下角和最大
- 稀疏矩阵求最小或最大的K个特征值及其特征向量
- 幂法求矩阵最大特征值的近似解(C++实现)
- 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形
- GPU上大规模稀疏矩阵特征值计算高效算法之三——SLEPc测试
- 数值分析 幂法求矩阵A按模最大的特征值和相应的特征向量
- LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
- 【数学】Frobenius介值定理:非负矩阵最大特征值的上下界
- 九度OJ 1191:矩阵最大值 (矩阵计算)
- 眼底视网膜血管增强方法(五)Hessian矩阵最大特征值
- 九度OJ 1191:矩阵最大值 (矩阵计算)
- GPU上大规模稀疏矩阵特征值计算高效算法之一——GPU介绍
- 用幂法求矩阵的最大近似特征值 (JAVA)
- 调用方法计算数组的和,最大值,最小值