Matlab中的eig函数和Opecv中eigen()函数的区别
奇异值分解的理论参见下面的链接
http://www.cnblogs.com/pinard/p/6251584.html
https://blog.csdn.net/shenziheng1/article/details/52916278
https://blog.csdn.net/billbliss/article/details/78579308
https://blog.csdn.net/zhongkejingwang/article/details/43053513
https://blog.csdn.net/u010099080/article/details/68060274
在Matlab中的eig()函数,和Opencv中的eigen()函数,都是用来获得矩阵的特征值和特征矢量。并且,这两个函数的输入矩阵必须是对称矩阵。
Matlab中的eig()函数,常见的写法如下:
[V D]=eig(A);
D是矩阵A的特征值组成的对角矩阵,与A是同数据类型,同尺度。V是与特征值对应的特征矢量组成的矩阵。
在Opencv中的eigen()函数,常见的写法如下:
myEigen(A,D,V);
函数中的A是输入矩阵,D和V是输出的特征值矢量和特征矢量组成的矩阵。eig()函数与eigen()函数的不同之处是:
1、在eigen()中的D是一个一维特征值组成的列矢量,并且特征值是按照降序排序;而在eig()中的D则是一个以特征值为对角的对角矩阵,特征值是按照升序排序。
2、在eigen()中的V是特征矢量组成的矩阵,矩阵中的每一行就是一个特征矢量;而在eig()中的V则是以特征矢量组成的矩阵,矩阵中的每一列即是一个特征矢量。
下面是同一个实例,在Matlab中和Opencv中的比较:
首先是Matlab中的eig函数的实例代码:
clear;
clc;
A=[,,;
,,;
,,];
[V D]=eig(A);
A_r=V*D*V';
输入结果如下:

下面是Opencv中eigen函数的实例代码:
//为方便与Matlab中的eig()函数比较,我把eigen封装在一个函数里,并将特征值矢量转换成对角矩阵,与Matlab中类似
void myEigen(Mat&A,Mat&D,Mat&V)
{
eigen(A,D,V);
Mat E=Mat::eye(A.size(),A.type());
for(int i=;i<A.rows;i++)
{
E.at<double>(i,i)=D.at<double>(,i);
}
D=E.clone(); }
const double eps=2.224e-16;
int main()
{
Mat A=(Mat_<double>(,)<<
,,,
,,,
,,);
Mat D,V;
myEigen(A,D,V); Mat A_r=V.t()*D*V; cout<<"原矩阵 A ="<<endl<<A<<endl;
cout<<"重构矩阵A_r="<<endl<<A_r<<endl<<endl;
cout<<"D="<<endl<<D<<endl;
cout<<"V="<<endl<<V<<endl;
return ;
}
输出结果如下:

比较Matlab和Opencv中的D、V值:

Opencv中V的第一列,与Matlab中V的第一行数值一直,但排序相反,其它行列对比也基本一致。
Matlab中的eig函数和Opecv中eigen()函数的区别的更多相关文章
- Matlab中psf2otf()函数在opencv中的实现
在Matlab中有个psf2otf()函数,可以将小尺寸的点扩散函数,扩大尺寸,并作二维傅里叶变换,opencv中没有这个函数,所以编了这么个函数: /************************ ...
- Matlab读取cifar10 train_quick.sh输出txt中信息
感谢 网友 Vagrant的提醒.之前 一直就看个最后的accuracy.这个应该并不靠谱.最好把说有的信息都看一下.而一个一个看.根本记不住.只能把数据读取在图片中显示一下,才比较直观. 本文就是读 ...
- 表值函数与JS中split()的联系
在公司用云平台做开发就是麻烦 ,做了很多功能或者有些收获,都没办法写博客,结果回家了自己要把大脑里面记住的写出来. split()这个函数我们并不陌生,但是当前台有许多字段然后随意勾选后的这些参数传递 ...
- 借助JavaScript中的时间函数改变Html中Table边框的颜色
借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...
- php中引用&的真正理解-变量引用、函数引用、对象引用
php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. ...
- 跟着百度学PHP[5]函数篇2-PHP中的特殊形式的函数
目录...................................................... .00x1 可变函数 在PHP里面如果说将“函数名称”赋予字符串类型的变量.在调用这个 ...
- C中的qsort函数和C++中的sort函数的理解与使用
一.qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); ...
- javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js中的全局变量和静态变量的使用, js 的调试?- 如果js出错, js引擎 就会停止, 这会 导致 后面的 html中 refer 该函数时, 会报错 函数为定义!!
效果里面的函数, 如show, hide,slideDown等, 这些都叫 "效果"函数, 但是里面可以包含动画, 也可以 不包含动画. 动画,是指 元素 的内容 是 逐渐 显示/ ...
随机推荐
- Linux/Centos查看进程占用内存大小的几种方法总结
1.命令行输入top回车,然后按下大写M按照memory排序,按下大写P按照CPU排序. 2. ps -ef | grep "进程名" ps -e -o 'pid,comm ...
- python的方法VSjava方法
java 类方法和实例方法 类方法 用static修饰的方法. 由于类方法是属于整个类的,所以类方法的方法体中不能有与类的对象有关的内容. 即类方法体有如下限制: 1.类方法中不能引用对象变量: 2. ...
- docker下安装运行mysql的过程以mysql5.7为例
一.查找mysql资源 docker search mysql 其实这步顶多是看看有哪些mysql资源,除非你自己commit过一个特定的版本,否则直接执行下一步 二.安装mysql docker p ...
- Python之列表与元组的区别详解
相同点:都是序列类型 回答它们的区别之前,先来说说两者有什么相同之处.list 与 tuple 都是序列类型的容器对象,可以存放任何类型的数据.支持切片.迭代等操作 foos = [0, 1, 2, ...
- BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)
转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...
- Python之signal模块的使用
常用的信号值如下: 信号值 事件 处理方式 SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT "建立CORE文件终止进程,并且生成core文件" ...
- [Python]Python3调用java代码
环境:Ubuntu16.04 桌面版 Ubuntu安装java的详细教程:https://www.cnblogs.com/ttkl/p/11933884.html 安装JPype1 pip3 inst ...
- Codeforces 981 D.Bookshelves(数位DP)
Codeforces 981 D.Bookshelves 题目大意: 给n个数,将这n个数分为k段,(n,k<=50)分别对每一段求和,再将每个求和的结果做与运算(&).求最终结果的最大 ...
- Python 之目录处理
目录处理 OS目录处理目录-->路径,文件夹 文件:txt 1. 新建和删除一个目录 import os #引入os目录from xx import xx os.mkdir("D:\\ ...
- java实现几种常用排序:冒泡排序
一.冒泡排序介绍 冒泡排序是我们得最多的排序方式之一,原因是简单易实现,且原理易懂.顾名思义,冒泡排序,它的排序过程就像水中的气泡一样,一个一个上浮到水面. 二.冒泡排序原理分析 三.冒泡排序代码实现 ...