c语言计算矩阵特征值和特征向量-1(幂法)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define M 3 //方阵的行数 列数
#define ε0 0.00000001//ε0为要求的精度
#define N 100000//最大迭代次数 //函数预声明
void printMatrix(double a[][], int m, int n);//矩阵的打印
void printVector(double a[], int m);//向量的打印
double dotVector(double a[], double b[], int m);//两个一维向量之积,结果为一个数
void dotMatrVect(double a[][], double yk0[], double uk1[], int m);//矩阵和向量点积u=a.*y,yk0对应于书上y(k-1)
void unitVector(double a[], int η, int m);//向量的单位化
double relaError(double lamada1, double lamada2);//计算相对误差 //主函数
int main(void)
{
double a[M][M] = { { , -, }, { -, -, }, { -, -, } };//待求特征值和特征向量的矩阵
double uk0[M] = { 1.0, 0.0, 0.0 };//迭代向量
double uk1[M] = { 0.0, 0.0, 0.0 };//迭代向量
double β0 = 0.0;//β(k-1)
double β1 = 0.0;//βk
double η0 = 0.0;//向量u(k-1)的二范数
double ε = 0.0;//计算的精度
printf("待求特征值和特征向量的矩阵A:\n");
printMatrix(a, M, M);
printf("\n");
printf("初始向量u0:\n");
printVector(uk0, M);
printf("\n");
printf("第几次计算\t\t uk\t\t\t\t yk\t\t βk\n");
for (int i = ; i < N; i++)
{
printf("%d\t", i);//***打印计算次数i
printVector(uk0, M);//***打印uk
printf("|");//***打印分隔
η0 = sqrt(dotVector(uk0, uk0, M));//初始向量u0的2范数
unitVector(uk0, η0, M);//将初始向量u0单位化作为y(k-1)也就是yk0
printVector(uk0, M); //***打印单位化后的uk0,也就是y(k-1)
dotMatrVect(a, uk0, uk1, M);//uk1 = A.*yk0;
printf("|");//***打印分隔
β1 = dotVector(uk0, uk1, M);//β1=y(k-1).*uk1
if (i>)
{
printf("%lf ", β1);//***打印βk
}
printf("\n");
ε = relaError(β0, β1);
//判断是否收敛
if (ε < ε0) //若收敛
{
printf("收敛\n");
break;
}
else //若不收敛,则变量交换 uk0=uk1;
{
//double tem = 0.0;
for (int q = ; q < M; q++)
{
//uk0[q] = uk1[q];
//tem = uk0[q];
uk0[q] = uk1[q];
uk1[q] = 0.0;//在第二次使用前一定把uk1[i]的所有元素归零!!!!!!
}
β0 = β1;
}
} system("pause");
} //函数具体执行 //矩阵的打印
void printMatrix(double a[][M], int m, int n)
{
for (int i = ; i<m; i++)
{
for (int j = ; j<n; j++)
{
printf("%lf ", a[i][j]);
}
printf("\n");
}
}
//向量的打印
void printVector(double a[], int m)
{
for (int i = ; i < m; i++)
{
printf("%lf ", a[i]);
}
}
//两个一维向量之积
double dotVector(double a[], double b[], int m)
{
double dotsum = 0.0;
for (int i = ; i < m; i++)
{
dotsum = dotsum + a[i] * b[i];
}
return(dotsum);
}
//矩阵和向量点积u=a.*y,yk0对应于书上y(k-1)
void dotMatrVect(double a[][M], double yk0[], double uk1[], int m)
{
double a1, b, c;
for (int i = ; i < m; i++)
{
uk1[i] = ;//在第二次使用前一定把uk1[i]的所有元素归零!!!!!!
for (int j = ; j < m; j++)
{
uk1[i] = uk1[i] + a[i][j] * yk0[j];//在第二次使用前一定把uk1[i]的所有元素归零!!!!!!!!!
a1 = a[i][j];
b = yk0[j];
c = uk1[i];
//printf("a[%d][%d]=%lf\n",i,j,a[i][j]);
} }
//printVector(uk1, 3);
}
//向量的单位化
void unitVector(double a[], int η, int m)
{
for (int i = ; i < m; i++)
{
a[i] = a[i] / η;
}
}
//计算误差
double relaError(double β1, double β2)
{
double ε;
ε = fabs(β2 - β1) / fabs(β2);
return ε;
}
为啥上面的总是算的不是太精确呢??
奥,因为二范数取的是int类型;
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define M 3 //方阵的行数 列数
#define ε0 0.00000001//ε0为要求的精度
#define N 100000//最大迭代次数 //函数预声明
void printMatrix(double a[][], int m, int n);//矩阵的打印
void printVector(double a[], int m);//向量的打印
double dotVector(double a[], double b[], int m);//两个一维向量之积,结果为一个数
void dotMatrVect(double a[][], double yk0[], double uk1[], int m);//矩阵和向量点积u=a.*y,yk0对应于书上y(k-1)
void unitVector(double a[], double η, int m);//向量的单位化
double relaError(double lamada1, double lamada2);//计算相对误差 //主函数
int main(void)
{
double a[M][M] = { { , -, }, { -, -, }, { -, -, } };//待求特征值和特征向量的矩阵
double uk0[M] = { 2.0, 1.0, 6.0 };//迭代向量
double uk1[M] = { 0.0, 0.0, 0.0 };//迭代向量
double β0 = 0.0;//β(k-1)
double β1 = 0.0;//βk
double η0 = 0.0;//向量u(k-1)的二范数
double ε = 0.0;//计算的精度
printf("待求特征值和特征向量的矩阵A:\n");
printMatrix(a, M, M);
printf("\n");
printf("初始向量u0:\n");
printVector(uk0, M);
printf("\n");
printf("第几次计算\t\t uk\t\t\t\t yk\t\t βk\n");
for (int i = ; i < N; i++)
{
printf("%d\t", i);//***打印计算次数i
printVector(uk0, M);//***打印uk
printf("|");//***打印分隔
η0 = sqrt(dotVector(uk0, uk0, M));//初始向量u0的2范数
unitVector(uk0, η0, M);//将初始向量u0单位化作为y(k-1)也就是yk0
printVector(uk0, M); //***打印单位化后的uk0,也就是y(k-1)
dotMatrVect(a, uk0, uk1, M);//uk1 = A.*yk0;
printf("|");//***打印分隔
β1 = dotVector(uk0, uk1, M);//β1=y(k-1).*uk1
if (i>)
{
printf("%lf ", β1);//***打印βk
}
printf("\n");
ε = relaError(β0, β1);
//判断是否收敛
if (ε < ε0) //若收敛
{
printf("收敛\n");
break;
}
else //若不收敛,则变量交换 uk0=uk1;
{
//double tem = 0.0;
for (int q = ; q < M; q++)
{
//uk0[q] = uk1[q];
//tem = uk0[q];
uk0[q] = uk1[q];
uk1[q] = 0.0;//在第二次使用前一定把uk1[i]的所有元素归零!!!!!!
}
β0 = β1;
}
} system("pause");
} //函数具体执行 //矩阵的打印
void printMatrix(double a[][M], int m, int n)
{
for (int i = ; i<m; i++)
{
for (int j = ; j<n; j++)
{
printf("%lf ", a[i][j]);
}
printf("\n");
}
}
//向量的打印
void printVector(double a[], int m)
{
for (int i = ; i < m; i++)
{
printf("%lf ", a[i]);
}
}
//两个一维向量之积
double dotVector(double a[], double b[], int m)
{
double dotsum = 0.0;
for (int i = ; i < m; i++)
{
dotsum = dotsum + a[i] * b[i];
}
return(dotsum);
}
//矩阵和向量点积u=a.*y,yk0对应于书上y(k-1)
void dotMatrVect(double a[][M], double yk0[], double uk1[], int m)
{
double a1, b, c;
for (int i = ; i < m; i++)
{
uk1[i] = ;//在第二次使用前一定把uk1[i]的所有元素归零!!!!!!
for (int j = ; j < m; j++)
{
uk1[i] = uk1[i] + a[i][j] * yk0[j];//在第二次使用前一定把uk1[i]的所有元素归零!!!!!!!!!
a1 = a[i][j];
b = yk0[j];
c = uk1[i];
//printf("a[%d][%d]=%lf\n",i,j,a[i][j]);
} }
//printVector(uk1, 3);
}
//向量的单位化
void unitVector(double a[], double η, int m)
{
for (int i = ; i < m; i++)
{
a[i] = a[i] / η;
}
}
//计算误差
double relaError(double β1, double β2)
{
double ε;
ε = fabs(β2 - β1) / fabs(β2);
return ε;
}

精确结果是 绝对值最大的特征值为45,对应的特征向量为(0,-0.5,-1)
c语言计算矩阵特征值和特征向量-1(幂法)的更多相关文章
- 矩阵的特征值和特征向量的雅克比算法C/C++实现
矩阵的特征值和特征向量是线性代数以及矩阵论中很重要的一个概念.在遥感领域也是经经常使用到.比方多光谱以及高光谱图像的主成分分析要求解波段间协方差矩阵或者相关系数矩阵的特征值和特征向量. 依据普通线性代 ...
- 采用梯度下降优化器(Gradient Descent optimizer)结合禁忌搜索(Tabu Search)求解矩阵的全部特征值和特征向量
[前言] 对于矩阵(Matrix)的特征值(Eigens)求解,采用数值分析(Number Analysis)的方法有一些,我熟知的是针对实对称矩阵(Real Symmetric Matrix)的特征 ...
- (原)使用mkl计算特征值和特征向量
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5585271.html 参考文档:mkl官方文档 lapack_int LAPACKE_sgeev(in ...
- 利用python做矩阵的简单运算(行列式、特征值、特征向量等的求解)
import numpy as np lis = np.mat([[1,2,3],[3,4,5],[4,5,6]]) print(np.linalg.inv(lis)) # 求矩阵的逆矩阵 [[-1. ...
- python计算平面的法向-利用协方差矩阵求解特征值和特征向量
Obvious,最小特征值对应的特征向量为平面的法向 这个问题还有个关键是通过python求协方差矩阵的特征值和特征向量,np.linalg.eig()方法直接返回了特征值的向量和特征向量的矩阵 sc ...
- java语言编写矩阵的四则运算
题目要求如下: 设计程序实现矩阵的四则运算 设计要求: (1) 实现矩阵的四则运算. (2) 考虑实现带变元的矩阵计算. (3)考虑实现矩阵的特征值和特征向量的计算. 我使用java语言写的 目录结构 ...
- opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量
本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...
- eig()函数求特征值、特征向量、归一化
在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有 5种:(1) E=eig(A):求矩阵A的全部特征值,构成向量E. 想求最大特征值用:max(eig(A))就好了 ...
- Python与矩阵论——特征值与特征向量
Python计算特征值与特征向量案例 例子1 import numpy as np A = np.array([[3,-1],[-1,3]]) print('打印A:\n{}'.format(A)) ...
随机推荐
- Rdlc报表 数据汇总分组展示
1.从工具箱拉出表或者矩阵(本次使用的是矩阵) 2.选择需要的数据集,没有就新建一个数据集,名称自己起好,下面有用到 3.将行组和行列显示出来(右击报表--试图=>) 4.双击行组下的RowGr ...
- java的4种代码块
一.普通代码块 直接在一个方法中出现的{}就称为普通代码块,例子程序如下: public class CodeDemo01{ public static void main(String[] args ...
- VMware Ubuntu Kaldi
1.VMware10.0 秘钥网上搜就好了 2.ubuntu12.04 (1)安了几次14.04,16.04,12.04,最后窗口和分辨率的bug 还是没有解决 (2)终端显示菱形乱码的解决:直接用英 ...
- ajax 和 post 传多个参数值具体怎么写
ajax data:{id:id,name:name} 正确 data:{id:"001",name:"王俊凯"} 正确 data:{"id" ...
- JQuery_元素样式操作
元素样式操作包括了直接设置CSS 样式.增加CSS 类别.类别切换.删除类别这几种操作方法.而在整个jQuery 使用频率上来看,CSS 样式的操作也是极高的,所以需要重点掌握. 一.css()方法 ...
- File system needs to be upgraded. You have version null and I want version 7
安装hbase时候报错: File system needs to be upgraded. You have version null and I want version 7 注: 我安装的hba ...
- 安装idea开发工具
1.网上去下载一个安装包,有的是需要注册码的(可以网上搜索注册码) 2.设置快捷键,可以直接选择使用eclipse的快捷键 3.配置maven 4.配置Git 5.配置tomcat
- ant 错误 Specified VM install not found: type Standard VM, name jdk1.6.0_27
ant 错误 ant Specified VM install not found: type Standard VM, name jdk1.6.0_27 原因: 安装了新的jdk, 在workspa ...
- eclipse: The superclass "javax.servlet.http.HttpServlet" was not found 解决方案
解决步骤: 1. 安装Tomcat8.5 Server 2. eclipse 新建Tomcat 8.5 Server 3. 配置build path 添加 Server Runtime 1.右键项目 ...
- Android开发之无线遥控器
最近弄了一个UDP/TCP的小东西,主要需要实现的功能如下(服务器端): 1.基于局域网 2.服务器端网络接口为无线与有线 3.服务器端接收到客户端的数据需要模拟按键进行处理 4.开机自启动 5.使用 ...