Sample source codes of SVD (singular value decomposition) are shown here. Note that these codes simply calls the function defined in each software library. SVD programming codes witten by MATLAB, and Python&numpy are shown. SVD program written in C/C++ is also available. SVD codes of Eigen library and SVD codes of OpenCV are shown.
ROW = randi([2 10]);
COL = randi([2 10]);
A = 99.9*rand(ROW, COL);
[U,W,V] = svd(A,'econ');
VT = V.';
disp("SVD result")
disp("A =")
disp(A)
disp("U =")
disp(U)
disp("W =")
disp(W)
disp("V^T =")
disp(VT)
check = U * W * VT;
disp("Check")
disp("U W V^T =")
disp(check)
disp("Coincide with A")
import numpy as
np
def main():
ROW = np.random.randint(2,
10)
COL = np.random.randint(2,
10)
A = np.random.uniform(0.0,
99.9, (ROW, COL))
U,W,VT = np.linalg.svd(A, full_matrices=False)
print("SVD result")
print("A=", A)
print("U=", U)
print("W=", W)
print("V^T=",
VT)
matw = np.diag(W)
check = np.dot(np.dot(U, matw), VT)
print("Check")
print("U W V^T=",
check)
print("Coincide with
A")
if __name__ ==
'__main__':
main()
import numpy as
np
import cv2
def main():
ROW = np.random.randint(2,
10)
COL = np.random.randint(2,
10)
A = np.random.uniform(0.0,
99.9, (ROW, COL))
W,U,VT = cv2.SVDecomp(A)
print("SVD
result")
print("A=",
A)
print("U=",
U)
print("W=",
W)
print("V^T=",
VT)
matw = np.diagflat(W)
check = np.dot(np.dot(U, matw), VT)
print("Check")
print("U
W V^T=", check)
print("Coincide
with A")
if __name__ ==
'__main__':
main()
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
#include "Eigen/Core"
#include "Eigen/SVD"
using namespace Eigen;
int main()
{
srand((unsigned)time(NULL));
int ROW = rand() % 8 + 2;
int COL = rand() % 8 + 2;
MatrixXd A = (MatrixXd::Random(ROW,
COL) + MatrixXd::Ones(ROW,
COL)) / 2.0 *
99.9;
JacobiSVD<MatrixXd>
svd(A, ComputeThinU |
ComputeThinV);
MatrixXd VT =
svd.matrixV().transpose();
cout <<
"SVD result" <<
endl << endl;
cout <<
"A=" << endl
<< A << endl
<< endl;
cout <<
"U=" << endl
<< svd.matrixU() <<
endl << endl;
cout <<
"W=" << endl
<< svd.singularValues()
<< endl <<
endl;
cout <<
"V^T=" << endl
<< VT << endl
<< endl;
cout << endl;
MatrixXd W =
svd.singularValues().asDiagonal();
MatrixXd check =
svd.matrixU() * W *
VT;
cout <<
"Check" <<
endl << endl;
cout <<
"U W V^T=" <<
endl << kenzan <<
endl << endl;
cout <<
"Coincide with A" <<
endl << endl;
cout <<
"Push enter" <<
endl;
cin.get();
return 0;
}
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
#include "Eigen/Core"
#include "Eigen/SVD"
using namespace Eigen;
int main()
{
srand((unsigned)time(NULL));
int ROW = rand() % 8 + 2;
int COL = rand() % 8 + 2;
MatrixXd A = (MatrixXd::Random(ROW,
COL) + MatrixXd::Ones(ROW,
COL)) / 2.0 *
99.9;
BDCSVD<MatrixXd>
svd(A, ComputeThinU |
ComputeThinV);
MatrixXd VT =
svd.matrixV().transpose();
cout <<
"SVD result" <<
endl << endl;
cout <<
"A=" << endl
<< A << endl
<< endl;
cout <<
"U=" << endl
<< svd.matrixU() <<
endl << endl;
cout <<
"W=" << endl
<< svd.singularValues()
<< endl <<
endl;
cout <<
"V^T=" << endl
<< VT << endl
<< endl;
cout << endl;
MatrixXd W =
svd.singularValues().asDiagonal();
MatrixXd check =
svd.matrixU() * W *
VT;
cout <<
"Check" <<
endl << endl;
cout <<
"U W V^T=" <<
endl << kenzan <<
endl << endl;
cout <<
"Coincide with A" <<
endl << endl;
cout <<
"Push enter" <<
endl;
cin.get();
return 0;
}
// Include directory C:\OpenCV3.1\build\include
// Library directory (x64)
C:\OpenCV3.1\build\x64\vc14\lib
// PATH (x64) C:\OpenCV3.1\build\x64\vc14\bin
#if _DEBUG
#pragma comment(lib,
"opencv_world310d.lib")
#else
#pragma comment(lib,
"opencv_world310.lib")
#endif
#include <time.h>
#include <iostream>
using namespace std;
#include
<opencv2/opencv.hpp>
using namespace cv;
int main()
{
RNG gen(getTickCount());
int ROW = gen.uniform(2,
10);
int COL = gen.uniform(2,
10);
Mat A(ROW, COL,
CV_64F);
gen.fill(A, RNG::UNIFORM,
0.0, 99.9);
SVD svd(A);
cout <<
"SVD result" <<
endl << endl;
cout <<
"A=" << A
<< endl <<
endl;
cout <<
"U=" << svd.u
<< endl <<
endl;
cout <<
"W=" << svd.w
<< endl <<
endl;
cout <<
"V^T=" <<
svd.vt << endl <<
endl;
cout << endl;
Mat matw =
Mat::diag(svd.w);
Mat check = svd.u
* matw *
svd.vt;
cout <<
"Check" <<
endl << endl;
cout <<
"U W V^T=" <<
check << endl <<
endl;
cout <<
"Coincide with A" <<
endl << endl;
cout <<
"Push enter" <<
endl;
cin.get();
return 0;
}
// Include directory C:\OpenCV2.4.11\build\include
// Library directory (x86)
C:\OpenCV2.4.11\build\x86\vc12\lib
// Library directory (x64)
C:\OpenCV2.4.11\build\x64\vc12\lib
// PATH (x86) C:\OpenCV2.4.11\build\x86\vc12\bin
// PATH (x64) C:\OpenCV2.4.11\build\x64\vc12\bin
#if _DEBUG
#pragma comment(lib,
"opencv_core2411d.lib")
#pragma comment(lib,
"opencv_highgui2411d.lib")
#pragma comment(lib,
"opencv_imgproc2411d.lib")
#else
#pragma comment(lib,
"opencv_core2411.lib")
#pragma comment(lib,
"opencv_highgui2411.lib")
#pragma comment(lib,
"opencv_imgproc2411.lib")
#endif
#include
<opencv2/opencv.hpp>
using namespace cv;
#include <stdio.h>
#include <conio.h>
#include <time.h>
int main()
{
srand((unsigned)time(NULL));
int ROW = rand() % 8 + 2;
int COL = rand() % 8 + 2;
Mat A(ROW, COL,
CV_64F);
for (int
i = 0; i < A.rows; i++) {
for
(int j = 0; j < A.cols; j++) {
A.at<double>(i,
j) = 99.9 * (double)rand() / (double)RAND_MAX;
}
}
SVD svd(A);
printf("SVD
result\n");
printf("\n");
printf("A=\n");
for (int
i = 0; i < A.rows; i++) {
for
(int j = 0; j < A.cols; j++) {
printf("%1.2f ",
A.at<double>(i, j));
}
printf("\n");
}
printf("U=\n");
for (int
i = 0; i < svd.u.rows; i++) {
for
(int j = 0; j < svd.u.cols; j++) {
printf("%1.2f ",
svd.u.at<double>(i, j));
}
printf("\n");
}
printf("W=\n");
for (int
i = 0; i < svd.w.rows; i++) {
for
(int j = 0; j < svd.w.cols; j++) {
printf("%1.2f ",
svd.w.at<double>(i, j));
}
printf("\n");
}
printf("V^T=\n");
for (int
i = 0; i < svd.vt.rows; i++) {
for
(int j = 0; j < svd.vt.cols; j++) {
printf("%1.2f ",
svd.vt.at<double>(i, j));
}
printf("\n");
}
printf("\n");
Mat matw =
Mat::zeros(svd.w.rows, svd.w.rows,
CV_64F);
for (int
i = 0; i < svd.w.rows; i++) {
matw.at<double>(i,
i) = svd.w.at<double>(i, 0);
}
Mat check = svd.u
* matw *
svd.vt;
printf("Check\n");
printf("U
W V^T=\n");
for (int
i = 0; i < check.rows; i++) {
for
(int j = 0; j < check.cols; j++) {
printf("%1.2f ",
check.at<double>(i, j));
}
printf("\n");
}
printf("Coincide
with A\n");
_getch();
return 0;
}
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include "nr3/nr3.h"
#include "nr3/svd.h"
int main()
{
srand((unsigned)time(NULL));
int ROW = rand() % 8 + 2;
int COL = rand() % 8 + 2;
MatDoub A(ROW, COL);
for (int
i = 0; i < ROW; i++) {
for
(int j = 0;j < COL;j++) {
A[i][j]
= 99.9 * (double)rand() / (double)RAND_MAX;
}
}
SVD svd(A);
printf("SVD
result\n");
printf("\n");
printf("A=\n");
for (int
i = 0; i < ROW; i++) {
for
(int j = 0; j < COL; j++) {
printf("%1.2f ",
A[i][j]);
}
printf("\n");
}
printf("U=\n");
for (int
i = 0; i < svd.u.nrows(); i++) {
for
(int j = 0; j < svd.u.ncols(); j++) {
printf("%1.2f ",
svd.u[i][j]);
}
printf("\n");
}
printf("W=\n");
for (int
i = 0; i < svd.w.size(); i++) {
printf("%1.2f\n",
svd.w[i]);
}
printf("V^T=\n");
for (int
i = 0; i < svd.v.ncols(); i++) {
for
(int j = 0; j < svd.v.nrows(); j++) {
printf("%1.2f ",
svd.v[j][i]);
}
printf("\n");
}
printf("\n");
MatDoub check(ROW, COL);
for (int
i = 0; i < ROW; i++) {
for
(int j = 0; j < COL; j++) {
double val = 0.0;
for (int k =
0; k < svd.u.ncols(); k++) {
val += svd.u[i][k]
* svd.w[k] *
svd.v[j][k];
}
check[i][j]
= val;
}
}
printf("Check\n");
printf("U
W V^T=\n");
for (int
i = 0; i < check.nrows(); i++) {
for
(int j = 0; j < check.ncols(); j++) {
printf("%1.2f ",
check[i][j]);
}
printf("\n");
}
printf("Coincide
with A\n");
printf("Push
any key\n");
_getch();
return 0;
}