资源简介
这是一个用C++写的幂法和反幂法算法,基本没有特别的东西
代码片段和文件信息
//描述:用来用幂法和反幂法来解矩阵的特征值与特征向量
//输入:一个用一维数组表示的矩阵、矩阵的阶数
//输出:矩阵的某些特征值与特征向量
#include
#include
#include
#include
#include “Power_Method.h“
using namespace std;
const double EPS= 1e-6;
template
void InitData(int &N valuetype *matrix char *filename)
{
//从文件filename里读入matrix
fstream infile(filename ios_base::in);
for(int i=0; i infile >> matrix[i];
infile.close();
}
template
valuetype VectorMul(valuetype *a valuetype *b int &count)
{
valuetype res=0;
for(int i=0; i res += a[i]*b[i];
return res;
}
//计算矩阵与向量的积
//参数:outVec计算结果
template
void MatrixMulVector(valuetype *outVec valuetype *matrix valuetype *vec int&count)
{
for(int row=0; row {
valuetype sum = 0;
for(int col=0; col sum += matrix[row*count + col] * vec[col];
outVec[row] = sum;
}
}
//幂法主函数
//参数:outEigenvalue--特征值、outEigenvector--特征向量、matrix--输入的矩阵、order--矩阵的阶、center--输入的原点平移量
template
void PowerMethod(valuetype &outEigenvalue valuetype *outEigenvector valuetype *matrix int &order valuetype ¢er)
{
//初始化一些临时需要的变量
valuetype *u0 = new valuetype[order];
valuetype *u1 = new valuetype[order];
valuetype *y0 = new valuetype[order];
valuetype beta0=0 beta1=0;
size_t size = sizeof(u0);
memset(u0 0 order*size);
//初始化一个非零的向量u0
u0[0] = 1;
//平移矩阵
for(int i=0; i matrix[i*order+i] -=center;
//****************************************************
//幂法主过程
do
{
beta0 = beta1; //记录上次循环之后beta的值
memcpy(u0 u1 order*sizeof(valuetype));
valuetype lengthOfU = sqrt(VectorMul(u0 u0 order));
for(int i=0; i y0[i] = u0[i]/lengthOfU;
MatrixMulVector(u1 matrix y0 order); //u1 = matrix * y0
beta1 = VectorMul(y0 u1 order);
} while (abs(beta1-beta0)/abs(beta1) > EPS);
outEigenvalue = beta1 + center;
memcpy(outEigenvector y0 order*sizeof(valuetype));
//****************************************************
//销毁临时分配的空间
delete(u0 u1 y0);
//恢复平移过的矩阵
for(int i=0; i matrix[i*order+i] +=center;
}
//反幂法求解矩阵matrix的距离center最近的特征值
template
void InversePowerMethod(valuetype &outEigenvalue valuetype *outEigenvector valuetype *matrix int &order valuetype ¢er)
{
//初始化一些临时需要的变量
valuetype *u0 = new valuetype[order];
valuetype *u1 = new valuetype[order];
valuetype *y0 = new valuetype[order];
valuetype beta0=0 beta1=0;
size_t size = sizeof(u0);
memset(u0 0 order*size);
//初始化一个非零的向量u0
u0[0] = 1;
//平移矩阵
for(int i=0; i matrix[i*order+i] -=center;
//把matrix进行LU分解,以方便后面的解线性方程组
valuetype **LUMatrix = new valuetype*[order];
for(int i=0; i LUMatrix[i] = new valuetype[order];
LUMethod(LUMatrix matrix order);
//***************************************************
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 10200 2010-11-16 14:01 Power_Method.cpp
文件 1442 2010-10-10 23:20 Power_Method.h
- 上一篇:c++软件实习开发报告
- 下一篇:利用ODBC数据源的图书管理系统设计与开发
相关资源
- c++软件实习开发报告
- HDLC协议概述及c++实现
- C++自动生成等高线源程序
- c++简单线程池的实现
- Visual C++实现的FFT变换
- 数据结构课程设计公交线路优化查询
- vc++注册表文件关联,图标关联
- c++实现生产者消费者问题
- C#与C++进程间通信
- C++实验5代码5
- C++实验4代码4.3
- 清华大学C++ 郑莉老师教学视频 45集
- advapi32.lib77067
- 网络爬虫 C++ 代码
- 网关模板 C/C++程序编写
- 一个基于C++和mssql的本科生信息管理系
- 用c++写的一个udp聊天程序
- VC++面向对象与可视化程序设计第三版
- [网盘]C++Primer Plus第6版中文版.pdf
- 条件随机场资料CRFC++版
- 扫雷vc++sdk
- 04_图像编辑器实现.zip
- c++实现简单的topsis算法
- VC++折叠展开型百叶窗的窗体面板组
- 时间轮 C语言版
- socket实现的CS框架
- 用C++实现的CURE算法的源码
- C++实现的BIRCH算法
- 给予c++的多线程
- Windows+Sockets网络开发——基于Visual+
评论
共有 条评论