void dgesv_check_vector()
{
std::cout << "############ check dgesv vector ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dcovector y(M);
for(
int i=0;
i<y.l;
i++){
y(
i) =double( rand() /(RAND_MAX/10) );
}
CPPL::dgematrix A_original(A);
CPPL::dcovector y_original(y);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "y_original=\n" << y_original << std::endl;
A.dgesv(y);
std::cout << "A=\n" << A << std::endl;
std::cout << "y=\n" << y << std::endl;
std::cout << "A_original*y=\n" << A_original*y << std::endl;
}
void dgesv_check_matrix()
{
std::cout << "############ check dgesv matrix ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dgematrix Y(M,M);
for(
int i=0;
i<Y.
m;
i++){
for(
int j=0; j<Y.n; j++){
Y(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dgematrix A_original(A);
CPPL::dgematrix Y_original(Y);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "Y_original=\n" << Y_original << std::endl;
A.dgesv(Y);
std::cout << "A=\n" << A << std::endl;
std::cout << "Y=\n" << Y << std::endl;
std::cout << "A_original*Y=\n" << A_original*Y << std::endl;
}
void dgels_check_vector()
{
std::cout << "############ check dgels vector ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3), N(2);
CPPL::dgematrix A(M,N);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dcovector y(M);
for(
int i=0;
i<y.l;
i++){
y(
i) =double( rand() /(RAND_MAX/10) );
}
CPPL::dgematrix A_original(A);
CPPL::dcovector y_original(y);
A.dgels(y);
std::cout << "######## dgels(vec) ########" << std::endl;
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "y_original=\n" << y_original << std::endl;
std::cout << "A=\n" << A << std::endl;
std::cout << "y=\n" << y << std::endl;
std::cout << "A_original*y=\n" << A_original*y << std::endl;
A =A_original;
y =y_original;
double r;
A.dgels(y,r);
std::cout << "######## dgels(vec, residual) ########" << std::endl;
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "y_original=\n" << y_original << std::endl;
std::cout << "A=\n" << A << std::endl;
std::cout << "y=\n" << y << std::endl;
std::cout << "residual=" << r << std::endl;
std::cout << "A_original*y=\n" << A_original*y << std::endl;
}
void dgels_check_matrix()
{
std::cout << "############ check dgels matrix ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3), N(2);
CPPL::dgematrix A(M,N);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dgematrix Y(M,M);
for(
int i=0;
i<Y.
m;
i++){
for(
int j=0; j<Y.n; j++){
Y(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dgematrix A_original(A);
CPPL::dgematrix Y_original(Y);
A.dgels(Y);
std::cout << "######## dgels(mat) ########" << std::endl;
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "Y_original=\n" << Y_original << std::endl;
std::cout << "A=\n" << A << std::endl;
std::cout << "Y=\n" << Y << std::endl;
std::cout << "A_original*Y=\n" << A_original*Y << std::endl;
A =A_original;
Y =Y_original;
CPPL::drovector R;
A.dgels(Y,R);
std::cout << "######## dgels(mat, residual) ########" << std::endl;
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "Y_original=\n" << Y_original << std::endl;
std::cout << "A=\n" << A << std::endl;
std::cout << "Y=\n" << Y << std::endl;
std::cout << "residual=" << R << std::endl;
std::cout << "A_original*Y=\n" << A_original*Y << std::endl;
}
void dgelss_check_vector()
{
std::cout << "############ check dgelss vector ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3), N(4);
int RANK(0);
double RCOND(-1.0);
CPPL::dgematrix A(M,N);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dcovector b(M);
for(
int i=0;
i<b.l;
i++){
b(
i) =double( rand() /(RAND_MAX/10) );
}
CPPL::dcovector s;
CPPL::dgematrix A_original(A);
CPPL::dcovector b_original(b);
A.dgelss(b,s,RANK,RCOND);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "b_original=\n" << b_original << std::endl;
std::cout << "A=\n" << A << std::endl;
std::cout << "b=\n" << b << std::endl;
std::cout << "s=\n" << s << std::endl;
std::cout << "A_original*b=\n" << A_original*b << std::endl;
}
void dgelss_check_matrix()
{
std::cout << "############ check dgelss matrix ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3), N(4);
int RANK(0);
double RCOND(-1.0);
CPPL::dgematrix A(M,N);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dgematrix b(M,2);
for(
int i=0;
i<b.
m;
i++){
for(int j=0; j<b.n; j++){
b(
i,j) =double( rand() /(RAND_MAX/10) );
}
}
CPPL::dcovector s;
CPPL::dgematrix A_original(A);
CPPL::dgematrix b_original(b);
A.dgelss(b,s,RANK,RCOND);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "b_original=\n" << b_original << std::endl;
std::cout << "A=\n" << A << std::endl;
std::cout << "b=\n" << b << std::endl;
std::cout << "s=\n" << s << std::endl;
std::cout << "A_original*b=\n" << A_original*b << std::endl;
}
void dgeev_check_value()
{
std::cout << "############ check dgeev value ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
std::vector<double> wr, wi;
CPPL::dgematrix A_original(A);
A.dgeev(wr, wi);
std::cout << "A_original=\n" << A_original << std::endl;
for(
int i=0;
i<A.
m;
i++){
std::cout <<
"#### " <<
i <<
"th eigen ####" << std::endl;
std::cout <<
"wr=" << wr[
i] <<std::endl;
std::cout <<
"wi=" << wi[
i] <<std::endl;
}
}
void dgeev_check_right()
{
std::cout << "############ check dgeev right ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
std::vector<double> wr, wi;
std::vector<CPPL::dcovector> vrr, vri;
CPPL::dgematrix A_original(A);
A.dgeev(wr, wi ,vrr, vri);
std::cout << "A_original=\n" << A_original << std::endl;
for(
int i=0;
i<A.
m;
i++){
std::cout <<
"#### " <<
i <<
"th eigen ####" << std::endl;
std::cout <<
"wr=" << wr[
i] <<std::endl;
std::cout <<
"wi=" << wi[
i] <<std::endl;
std::cout <<
"vrr=\n" << vrr[
i] <<std::endl;
std::cout <<
"vri=\n" << vri[
i] <<std::endl;
std::cout << "Real[ [A]*{x} -lambda*{x} ] = (Should be zeros)\n"
<< A_original*vrr[
i] -(wr[
i]*vrr[
i] - wi[
i]*vri[
i])
<< std::endl;
std::cout << "Imag[ [A]*{x} -lambda*{x} ] = (Should be zeros)\n"
<< A_original*vri[
i] -(wr[
i]*vri[
i] + wi[
i]*vrr[
i])
<< std::endl;
}
}
void dgeev_check_left()
{
std::cout << "############ check dgeev left ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
std::vector<double> wr, wi;
std::vector<CPPL::drovector> vlr, vli;
CPPL::dgematrix A_original(A);
A.dgeev(wr, wi ,vlr, vli);
std::cout << "A_original=\n" << A_original << std::endl;
for(
int i=0;
i<A.
m;
i++){
std::cout <<
"#### " <<
i <<
"th eigen ####" << std::endl;
std::cout <<
"wr = " << wr[
i] << std::endl;
std::cout <<
"wi = " << wi[
i] << std::endl;
std::cout <<
"vlr = " << vlr[
i];
std::cout <<
"vli = " << vli[
i] << std::endl;
std::cout << "Real[ {x}*[A] -{x}*lambda ] = (Should be zeros)\n"
<< vlr[
i]*A_original -(vlr[
i]*wr[
i] - vli[
i]*wi[
i])
<< std::endl;
std::cout << "Imag[ {x}*[A] -{x}*lambda ] = (Should be zeros)\n"
<< vli[
i]*A_original -(vli[
i]*wr[
i] + vlr[
i]*wi[
i])
<< std::endl;
}
}
void dggev_check_value()
{
std::cout << "############ check dggev value ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M), B(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
B(
i,j) =double( rand() /(RAND_MAX/10) );
}}
std::vector<double> wr, wi;
CPPL::dgematrix A_original(A);
CPPL::dgematrix B_original(B);
A.dggev(B, wr, wi);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "B_original=\n" << B_original << std::endl;
for(
int i=0;
i<A.
m;
i++){
std::cout <<
"#### " <<
i <<
"th eigen ####" << std::endl;
std::cout <<
"wr=" << wr[
i] <<std::endl;
std::cout <<
"wi=" << wi[
i] <<std::endl;
}
}
void dggev_check_right()
{
std::cout << "############ check dggev right ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M), B(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
B(
i,j) =double( rand() /(RAND_MAX/10) );
}}
std::vector<double> wr, wi;
std::vector<CPPL::dcovector> vrr, vri;
CPPL::dgematrix A_original(A);
CPPL::dgematrix B_original(B);
A.dggev(B, wr, wi ,vrr, vri);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "B_original=\n" << B_original << std::endl;
for(
int i=0;
i<A.
m;
i++){
std::cout <<
"#### " <<
i <<
"th eigen ####" << std::endl;
std::cout <<
"wr=" << wr[
i] <<std::endl;
std::cout <<
"wi=" << wi[
i] <<std::endl;
std::cout <<
"vrr=\n" << vrr[
i] <<std::endl;
std::cout <<
"vri=\n" << vri[
i] <<std::endl;
std::cout << "Real[ [A]*{x} -lambda*[B]*{x} ] = (Should be zeros)\n"
-(wr[
i]*B_original*vrr[
i] - wi[
i]*B_original*vri[
i])
<< std::endl;
std::cout << "Imag[ [A]*{x} -lambda*[B]*{x} ] = (Should be zeros)\n"
-(wr[
i]*B_original*vri[
i] + wi[
i]*B_original*vrr[
i])
<< std::endl;
}
}
void dggev_check_left()
{
std::cout << "############ check dggev left ############" << std::endl;
srand(unsigned(time(NULL)));
int M(3);
CPPL::dgematrix A(M,M), B(M,M);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
B(
i,j) =double( rand() /(RAND_MAX/10) );
}}
std::vector<double> wr, wi;
std::vector<CPPL::drovector> vlr, vli;
CPPL::dgematrix A_original(A);
CPPL::dgematrix B_original(B);
A.dggev(B, wr, wi ,vlr, vli);
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "B_original=\n" << B_original << std::endl;
for(
int i=0;
i<A.
m;
i++){
std::cout <<
"#### " <<
i <<
"th eigen ####" << std::endl;
std::cout <<
"wr = " << wr[
i] << std::endl;
std::cout <<
"wi = " << wi[
i] << std::endl;
std::cout <<
"vlr = " << vlr[
i];
std::cout <<
"vli = " << vli[
i] << std::endl;
std::cout << "Real[ {x}*[A] -lambda*{x}*[B] ] = (Should be zeros)\n"
-(wr[
i]*vlr[
i]*B_original - wi[
i]*vli[
i]*B_original)
<< std::endl;
std::cout << "Imag[ [A]*{x} -lambda*{x}*[B] ] = (Should be zeros)\n"
-(wr[
i]*vli[
i]*B_original + wi[
i]*vlr[
i]*B_original)
<< std::endl;
}
}
void dgesvd_check()
{
std::cout << "############ check dgesvd ############" << std::endl;
srand(unsigned(time(NULL)));
int M(4), N(3);
CPPL::dgematrix A(M,N);
for(
int i=0;
i<A.
m;
i++){
for(
int j=0; j<A.n; j++){
A(
i,j) =double( rand() /(RAND_MAX/10) );
}}
CPPL::dgematrix A_original(A);
CPPL::dcovector S;
CPPL::dgematrix U, VT;
A.dgesvd(S,U,VT);
std::cout << "A=\n" << A << std::endl;
std::cout << "S=\n" << S << std::endl;
std::cout << "U=\n" << U << std::endl;
std::cout << "VT=\n" << VT << std::endl;
CPPL::dgematrix S_matrix(M,N);
S_matrix.zero();
for(
int i=0;
i<std::min(M,N);
i++){ S_matrix(
i,
i) =S(
i); }
std::cout << "S_matrix=\n" << S_matrix << std::endl;
std::cout << "A_original=\n" << A_original << std::endl;
std::cout << "U*S_matrix*VT=\n" << U*S_matrix*VT << std::endl;
}
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "cpplapack.h"
#include "dgesv_check.hpp"
#include "dgels_check.hpp"
#include "dgelss_check.hpp"
#include "dgeev_check.hpp"
#include "dggev_check.hpp"
#include "dgesvd_check.hpp"
#include "dgglse_check.hpp"
int main(int argc, char** argv)
{
dgesv_check_vector();
dgesv_check_matrix();
dgels_check_vector();
dgels_check_matrix();
dgelss_check_vector();
dgelss_check_matrix();
dgeev_check_value();
dgeev_check_right();
dgeev_check_left();
dggev_check_value();
dggev_check_right();
dggev_check_left();
dgesvd_check();
dgglse_check();
return 0;
}