E021

矩阵分解之qr、lu、chol分解的举例。

 

#include "stdafx.h"

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


int main()
{
cout << "矩阵常用分解展示... http://www.orsci.cn; http://www.jiangw.cn" << endl;
cout << endl;

mdouble x;
//vmt::randn(3, 3, x);
x = "1.01982, -0.417116, -0.251921; -1.79585, 1.08838, 0.0162436; 0.413233, -1.0135, 0.349871";
cout << "X = " << endl;
cout << x << endl;

{
cout << "========== Demo qr ================" << endl;
cout << "qr分解:X = Q * R!" << endl;
mdouble Q, R;
bool mFlag = vmt::qr(x, Q, R);
cout << "qr分解成功标记:" << mFlag << endl;
cout << "Q = " << endl;
cout << Q << endl;
cout << "R = " << endl;
cout << R << endl;
cout << "QR = " << endl;
cout << Q * R << endl;
}
{
cout << "========== Demo lu ================" << endl;
cout << "lu分解:PX = L * U!" << endl;
mdouble L, U, P;
bool mFlag = vmt::lu(x, L, U, P);
cout << "lu分解成功标记:" << mFlag << endl;
cout << "L = " << endl;
cout << L << endl;
cout << "U = " << endl;
cout << U << endl;
cout << "P = " << endl;
cout << P << endl;
cout << "PX = " << endl;
cout << P * x << endl;
cout << "LU = " << endl;
cout << L * U << endl;
}
{
cout << "========== Demo chol ================" << endl;
cout << "chol分解,要求X是对称正定阵,现模拟生成一个!" << endl;
x = x.T() * x; //形成一个对称阵
cout << "X = " << endl;
cout << x << endl;
mdouble R;
bool mFlag = vmt::chol(x, R);
cout << "chol_upper分解标记:" << mFlag << endl;
cout << "R =" << endl;
cout << R << endl;
cout << "R.T() * R =" << endl;
cout << R.T() * R << endl;

mFlag = vmt::chol(x, R, false);
cout << "chol_lower分解标记:" << mFlag << endl;
cout << "R =" << endl;
cout << R << endl;
cout << "R * R.T() =" << endl;
cout << R * R.T() << endl;
}
char pp;
cout << "press any key to stop..." << endl;
cin >> pp;

return 0;
}

输出

(一)运行结果

矩阵常用分解展示... http://www.orsci.cn; http://www.jiangw.cn

X =
rowCount = 3 colCount = 3
1.01982 -0.417116 -0.251921
-1.79585 1.08838 0.0162436
0.413233 -1.0135 0.349871

========== Demo qr ================
qr分解:X = Q * R!
qr分解成功标记:1
Q =
rowCount = 3 colCount = 3
0.48421 0.287461 -0.826381
-0.852669 -0.0567624 -0.519359
0.196203 -0.956109 -0.217625

R =
rowCount = 3 colCount = 3
2.10615 -1.32885 -0.0671874
0 0.787332 -0.407854
0 0 0.123606

QR =
rowCount = 3 colCount = 3
1.01982 -0.417116 -0.251921
-1.79585 1.08838 0.0162436
0.413233 -1.0135 0.349871

========== Demo lu ================
lu分解:PX = L * U!
lu分解成功标记:1
L =
rowCount = 3 colCount = 3
1 0 0
-0.230104 1 0
-0.567876 -0.263346 1

U =
rowCount = 3 colCount = 3
-1.79585 1.08838 0.0162436
0 -0.763059 0.353609
0 0 -0.149575

P =
rowCount = 3 colCount = 3
0 1 0
0 0 1
1 0 0

PX =
rowCount = 3 colCount = 3
-1.79585 1.08838 0.0162436
0.413233 -1.0135 0.349871
1.01982 -0.417116 -0.251921

LU =
rowCount = 3 colCount = 3
-1.79585 1.08838 0.0162436
0.413233 -1.0135 0.349871
1.01982 -0.417116 -0.251921

========== Demo chol ================
chol分解,要求X是对称正定阵,现模拟生成一个!
X =
rowCount = 3 colCount = 3
4.43587 -2.79876 -0.141507
-2.79876 2.38574 -0.231835
-0.141507 -0.231835 0.186138

chol_upper分解标记:1
R =
rowCount = 3 colCount = 3
2.10615 -1.32885 -0.0671874
0 0.787332 -0.407854
0 0 0.123606

R.T() * R =
rowCount = 3 colCount = 3
4.43587 -2.79876 -0.141507
-2.79876 2.38574 -0.231835
-0.141507 -0.231835 0.186138

chol_lower分解标记:1
R =
rowCount = 3 colCount = 3
2.10615 0 0
-1.32885 0.787332 0
-0.0671874 -0.407854 0.123606

R * R.T() =
rowCount = 3 colCount = 3
4.43587 -2.79876 -0.141507
-2.79876 2.38574 -0.231835
-0.141507 -0.231835 0.186138

press any key to stop...


(二)说明:

(1)矩阵分解qr、lu和Choleskey分解。注意:Choleskey分解要求输入的X是对称正定矩阵,否则分解失败。

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

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

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