svdrank_test.cpp
#include <iostream>
#include "Array/ArrayIo.h"
#include "LinAlg/LinAlg.h"
using namespace std;
int main()
{
Array2D< double > A(2, 2);
Array2D< double > U(2, 2);
Array2D< double > V(2, 2);
Array < double > w(2);
unsigned curr_row,
curr_col,
r(0);
double input_matrix[4] =
{
1., 3.,
-4., 3.
};
for (curr_row = 0; curr_row < 2; curr_row++) {
for (curr_col = 0; curr_col < 2; curr_col++) {
A(curr_row, curr_col) = input_matrix[curr_row*2+curr_col];
U(curr_row, curr_col) = 0.;
V(curr_row, curr_col) = 0.;
}
w(curr_row) = 0.;
}
svd(A, U, V, w);
svdsort(U, V, w);
r = svdrank(A, U, V, w);
cout << "input matrix:" << endl;
writeArray(A, cout);
cout << "column-orthogonal matrix U:" << endl;
writeArray(U, cout);
cout << "orthogonal matrix V:" << endl;
writeArray(V, cout);
cout << "vector of singular values:" << endl;
writeArray(w, cout);
cout << "\nrank of matrix A is " << r << endl;
if(fabs(w(0)- 5.14916)<1.e-5) exit(EXIT_SUCCESS);
else exit(EXIT_FAILURE);
}