E024

orsci中矩阵奇异值分解。svd(...)计算全部特征,svds(...)可以限制计算较大奇异值的个数,对于大矩阵有时不需要计算全部奇异值,可以调用svds(...)实现。

 

#include "stdafx.h"

#include "orsciJWVCL.h"
#include "orsciVM.h"
using namespace orsci;
using namespace orsci::vmt;


int main()
{
cout << " orsci: 奇异值分解svd(...)与svds(...) ... http://www.orsci.cn" << endl;
cout << endl;

mdouble X;
X.resize(5, 7);
X.fill(0, 0, 2); //按照列填充,从0开始间隔为2。
cout << "X = " << endl;
cout << X << endl;

mdouble U, V;
mdouble S;
bool flag = vmt::svd(X, U, S, V);
cout << "svd成功标记:" << flag << endl;
cout << "U = " << endl;
cout << U << endl;
cout << "S = " << endl;
cout << S << endl;
cout << "V = " << endl;
cout << V << endl;

cout << "U * S * V.T() = " << endl;
cout << U * S * V.T() << endl;

cout << "X-U*S*V.T() = " << endl;
cout << X - U * S * V.T() << endl;

cout << endl;
cout << "奇异值向量:" << endl;
cout << vmt::diag(S) << endl;

cout << endl;
cout << "press any key to stop..." << endl;
char pp;
cin >> pp;
return 0;
}

输出

(一)运行结果

orsci: 奇异值分解svd ... http://www.orsci.cn

X =
rowCount = 5 colCount = 7
0 10 20 30 40 50 60
2 12 22 32 42 52 62
4 14 24 34 44 54 64
6 16 26 36 46 56 66
8 18 28 38 48 58 68

svd成功标记:1
U =
rowCount = 5 colCount = 5
-0.407295 -0.658871 0.596548 0.10174 -0.18379
-0.426827 -0.343247 -0.42681 -0.162737 0.700964

-0.44636 -0.027623 -0.475794 -0.3699 -0.660904
-0.465892 0.288001 -0.154176 0.821049 -0.0459215

-0.485425 0.603625 0.460232 -0.390152 0.189652

S =
rowCount = 5 colCount = 7
233.813 0 0 0 0 0 0
0 8.46789 0 0 0 0 0
0 0 2.04753e-014 0 0 0 0
0 0 0 4.61561e-015 0 0 0
0 0 0 0 5.87633e-016 0 0

V =
rowCount = 7 colCount = 7
-0.0398518 0.680219 -0.715495 0.0309774 -0.146736
-0.00497478 0.0355614
-0.135304 0.517114 0.459817 -0.156459 0.272747
0.363861 0.521142
-0.230757 0.35401 0.34527 0.0932267 0.035483 -0.821335
-0.132951
-0.326209 0.190905 0.138332 -0.431914 0.0164508
0.304723 -0.747215
-0.421662 0.0278004 0.208011 0.52369 -0.665568 0.2465
0.0128577
-0.517114 -0.135304 -0.218208 0.471885 0.656533
0.0887109 -0.0713435
-0.612567 -0.298409 -0.217726 -0.531406 -0.16891
-0.177486 0.381949

U * S * V.T() =
rowCount = 5 colCount = 7
-8.70902e-015 10 20 30 40 50 60
2 12 22 32 42 52 62
4 14 24 34 44 54 64
6 16 26 36 46 56 66
8 18 28 38 48 58 68

X-U*S*V.T() =
rowCount = 5 colCount = 7
8.70902e-015 -8.88178e-015 -7.10543e-015 0 -7.10543e-015 -7.10543
e-015 -7.10543e-015
-3.19744e-014 -7.10543e-015 -7.10543e-015 -1.42109e-014 -1.42109e-014
-1.42109e-014 -2.13163e-014
-4.88498e-014 -5.32907e-015 -1.06581e-014 -1.42109e-014 -2.13163e-014
-2.84217e-014 -2.84217e-014
-5.9508e-014 -1.06581e-014 -1.42109e-014 -2.13163e-014 -2.84217e-014
-4.9738e-014 -4.26326e-014
-5.86198e-014 -3.55271e-015 -7.10543e-015 -7.10543e-015 -2.13163e-014
-3.55271e-014 -4.26326e-014

奇异值向量:
233.813 8.46789 2.04753e-014 4.61561e-015 5.87633e-016

press any key to stop...

(二)说明:

(1)矩阵奇异值分解,有着较多应用,svd(...)和svds(...)可以完成奇异值分解。

(2)关于向量与矩阵,请参看书籍:姜维. 《数据分析与数据挖掘》、《数据分析与数据挖掘实践》

(6)orsci包支持向量和矩阵计算,可下载配套软件orsci-art应用。

书籍 姜维. 《数据分析与数据挖掘》、《数据分析与数据挖掘实践》
软件 orsci-art开发包(C++语言、Delphi语言和C语言)。