参考

https://zhuanlan.zhihu.com/p/26306568

https://byjiang.com/2017/11/18/SVD/

http://www.bluebit.gr/matrix-calculator/

https://stackoverflow.com/questions/3856072/single-value-decomposition-implementation-c

https://stackoverflow.com/questions/35665090/svd-matlab-implementation

矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现

https://blog.csdn.net/fengbingchun/article/details/72853757

numpy.linalg.svd 源码

https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html

计算矩阵的特征值与特征向量的方法

https://blog.csdn.net/Junerror/article/details/80222540

https://jingyan.baidu.com/article/27fa7326afb4c146f8271ff3.html

不同的库计算结果不一致

原因在于特征向量不唯一,特征值是唯一的

来源

https://stackoverflow.com/questions/35665090/svd-matlab-implementation

Both are correct... The rows of the v you got from numpy are the eigenvectors of M.dot(M.T) (the transpose would be a conjugate transpose in the complex case). Eigenvectors are in the general case defined only up to a multiplicative constant, so you could multiply any row of v by a different number, and it will still be an eigenvector matrix.

There is the additional constraint on v that it be a unitary matrix, which loosely translates to its rows being orthonormal. This reduces your available choices for every eigenvector to only 2: the normalized eigenvector pointing in either direction. But you still get to multiply any row by -1 and still have a valid v.

 

A = U * S * V

1 手动计算

给定一个大小为的矩阵,虽然这个矩阵是方阵,但却不是对称矩阵,我们来看看它的奇异值分解是怎样的。

进行对称对角化分解,得到特征值为,相应地,特征向量为;由进行对称对角化分解,得到特征值为

当 lamda1 = 32

AA.T  -  lamda1*E = [-7 7

         7 -7]

线性变换 【-1 1

     0 0】

-x1 + x2 = 0

x1 = 1 x2 = 1 特征向量为【1 1】.T  归一化为【1/sqrt(2), 1/sqrt(2)】

x1 = -1 x2 = -1 特征向量为【-1 -1】.T  归一化为【-1/sqrt(2), -1/sqrt(2)】

当 lamda2 = 18

AA.T  -  lamda2*E = [7 7

         7 7]

线性变换 【1 1

     0 0】

x1 + x2 = 0

如果x1 = -1 x2 = 1 特征向量为【-1 1】.T  归一化为【-1/sqrt(2), 1/sqrt(2)】

如果 x1 = 1 x2 = -1 特征向量为【-1 1】.T  归一化为【1/sqrt(2), -1/sqrt(2)】可见特征向量不唯一

特征向量为。取,则矩阵的奇异值分解为

.

2 MATLAB 结果与手动计算不同

AB =  [[ 4 4 ],
[-3 3 ]]
[U,S,V] = svd(AB);
U
S
V'#需要转置

AB =

4 4
-3 3

U =

-1 0
0 1

S =

5.6569 0
0 4.2426

V =

-0.7071 -0.7071
-0.7071 0.7071

3 NUMPY结果与手动计算不同, 与matlab相同 它们都是调用lapack的svd分解算法。

import numpy as np
import math
import cv2
a = np.array([[4,4],[-3,3]])
# a = np.random.rand(2,2) * 10
print(a)
u, d, v = np.linalg.svd(a)
print(u)
print(d)
print(v)#不需要转置

A = [[ 4 4]
[-3 3]]

U = 
[[-1. 0.]
[ 0. 1.]]

S=
[5.65685425 4.24264069]

V=
[[-0.70710678 -0.70710678]
[-0.70710678 0.70710678]]

4 opencv结果 与手动计算结果相同

import numpy as np
import math
import cv2
a = np.array([[4,4],[-3,3]],dtype=np.float32)
# a = np.random.rand(2,2) * 10
print(a)
S1, U1, V1 = cv2.SVDecomp(a)
print(U1)
print(S1)
print(V1)#不需要转置

a = [[ 4. 4.]
[-3. 3.]]
U =

[[0.99999994 0. ]
[0. 1. ]]
S = [[5.656854 ]
[4.2426405]]

V =

[[ 0.70710677 0.70710677]
[-0.70710677 0.70710677]]

5  eigen结果与手动计算相同

#include <iostream>
#include <Eigen/SVD>
#include <Eigen/Dense>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream> using namespace std;
using namespace cv; //using Eigen::MatrixXf;
using namespace Eigen;
using namespace Eigen::internal;
using namespace Eigen::Architecture; int GetEigenSVD(Mat &Amat, Mat &Umat, Mat &Smat, Mat &Vmat)
{
//-------------------------------svd测试 eigen
Matrix2f A;
A(0,0)=Amat.at<double>(0,0);
A(0,1)=Amat.at<double>(0,1);
A(1,0)=Amat.at<double>(1,0);
A(1,1)=Amat.at<double>(1,1); JacobiSVD<Eigen::MatrixXf> svd(A, ComputeThinU | ComputeThinV );
Matrix2f V = svd.matrixV(), U = svd.matrixU();
Matrix2f S = U.inverse() * A * V.transpose().inverse(); // S = U^-1 * A * VT * -1
//Matrix2f Arestore = U * S * V.transpose();
// printeEigenMat(A ,"/sdcard/220/Ae.txt");
// printeEigenMat(U ,"/sdcard/220/Ue.txt");
// printeEigenMat(S ,"sdcard/220/Se.txt");
// printeEigenMat(V ,"sdcard/220/Ve.txt");
// printeEigenMat(U * S * V.transpose() ,"sdcard/220/U*S*VTe.txt"); Umat.at<double>(0,0) = U(0,0);
Umat.at<double>(0,1) = U(0,1);
Umat.at<double>(1,0) = U(1,0);
Umat.at<double>(1,1) = U(1,1);
Vmat.at<double>(0,0) = V(0,0);
Vmat.at<double>(0,1) = V(0,1);
Vmat.at<double>(1,0) = V(1,0);
Vmat.at<double>(1,1) = V(1,1);
Smat.at<double>(0,0) = S(0,0);
Smat.at<double>(0,1) = S(0,1);
Smat.at<double>(1,0) = S(1,0);
Smat.at<double>(1,1) = S(1,1);
// Smat.at<double>(0,0) = S(0,0);
// Smat.at<double>(0,1) = S(1,1);
//-------------------------------svd测试 eigen return 0;
} int main()
{
// egin();
// opencv3();
//Eigentest();
//opencv();
//similarityTest();
// double data[2][2] = { { 629.70374, 245.4427 },
// { -334.8119 , 862.1787 } }; double data[2][2] = { { 4, 4 },
{-3, 3} };
int dim = 2;
Mat A(dim,dim, CV_64FC1, data);
Mat U(dim, dim, CV_64FC1);
Mat V(dim, dim, CV_64FC1);
Mat S(dim, dim, CV_64FC1);
GetEigenSVD(A, U, S, V);
Mat Arestore = U * S * V.t();
cout <<A<<endl;
cout <<Arestore<< endl;
cout <<"U " << U<<endl;
cout <<"S " <<S<<endl;
cout <<"V " << V.t()<<endl;
cout <<V<<endl; return 0;
}

[4, 4;
-3, 3]

U =

[0.9999999403953552, 0;
0, 0.9999999403953552]
S =

[5.656854629516602, 0;
0, 4.242640972137451]
V =

[0.7071067690849304, 0.7071067690849304;
-0.7071067690849304, 0.7071067690849304]

6 在线计算网站 与手动计算不同

http://www.bluebit.gr/matrix-calculator/calculate.aspx

Input matrix:

 4.000  4.000
-3.000 3.000

Singular Value Decomposition:

U:

-1.000  0.000
0.000 1.000

S:

5.657 0.000
0.000 4.243

VT

-0.707 -0.707
-0.707 0.707

numpy opencv matlab eigen SVD结果对比的更多相关文章

  1. MATLAB与C语言对比实例:随机数生成

    MATLAB与C语言对比实例:随机数生成 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.整型随机数生成函数 1.C语言程序 int intrand ...

  2. OpenCV特征点检测算法对比

    识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点, ...

  3. 相机标定与矫正opencv+MATLAB

    博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...

  4. OpenCV进行图像相似度对比的几种办法

    转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/43853435, 来自:shiter编写程序的艺术 对计算图像相似度的方法,本文做 ...

  5. NumPy for MATLAB users

    http://mathesaurus.sourceforge.net/matlab-numpy.html Help MATLAB/Octave Python Description dochelp - ...

  6. 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)

    1.Easily Create High Quality Object Detectors with Deep Learning 2016/10/11 http://blog.dlib.net/201 ...

  7. numpy和matlab计算协方差矩阵的不同(matlab是标准的,numpy相当于转置后计算)

    matlab是标准的,numpy相当于转置后计算 >> x = [2,0,-1.4;2.2,0.2,-1.5;2.4,0.1,-1;1.9,0,-1.2] x = 2.0000    0 ...

  8. 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  9. Matlab/Eigen矩阵填充问题

    Matlab进行矩阵填充时可以填充空矩阵,相当于空矩阵不存在,例如一下代码: P_RES = [ P_xv P_xvy P_xv*dy_dxv'; P_yxv P_y P_yxv*dy_dxv'; d ...

随机推荐

  1. 深入理解Linux内核-进程调度

    1.什么时候进行进程切换 调度策略目标:1.进程响应尽量快:2.后台作业吞吐量尽量高:3.尽可能避免进程饥饿:4.低优先级和高优先级进程需要尽量调和. 调度策略:决定什么时候选择什么进程运行的规则.基 ...

  2. webp技术探索

    不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值且值得 ...

  3. 分析 ThreadLocal 内存泄漏问题

    ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用 ThreadLocal,就可能会导 ...

  4. 菜鸟学EJB(一)——第一个实例

    EJB用了那么长时间了,从来没写过关于它的东西,挺对不住它的.今天先写一个简单的小实例,虽然小但是却能体现出EJB的核心——分布式.我们可以将业务逻辑的接口跟实现部署到一台机器上,将调用它们的客户端部 ...

  5. bug ,improvements, features jira等信息

    https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12341764&projectId=12315522 https ...

  6. convert2utf8withbom

    很久以前给同事要的转码bash 当时windows和mac总是出现中文注释乱码的情况,让人心塞的难过.又因为是老项目,现有源码太多了,不可能改模板重新创建.只能跑一遍这个玩意儿了…… #!/bin/b ...

  7. SQL2008R2 安装图解

    安装SQL Server 2008 R2需要.NET Framework 3.5 SP1支持 这里我们的操作系统是Windows Server 2008 R2,已经默认自带了.NET Framewor ...

  8. .net System.IO之Stream的使用详解

    本篇文章是对.Net中System.IO之Stream的使用进行了详细的分析介绍,需要的朋友参考下 Stream在msdn的定义:提供字节序列的一般性视图(provides a generic vie ...

  9. 基于jQuery图片元素网格布局插件

    基于jQuery图片元素网格布局插件是一款可以将图片或HTML元素均匀分布排列为网格布局的jQuery插件jMosaic.效果图如下: 在线预览   源码下载 实现的代码. html代码: <c ...

  10. IIS时间格式设置

    IIS时间格式调整: (已解决)今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以“/”来分隔,而不是以“-”来分隔的,使得我在运行程序的时候老出错 ...