Introduction
Introduction Statistics Contact Development Disclaimer Help
tmain.cpp - numeric - C++ library with numerical algorithms
git clone git://src.adamsgaard.dk/numeric
Log
Files
Refs
LICENSE
---
tmain.cpp (2762B)
---
1 #include <iostream>
2 #include <armadillo>
3 #include "header.h"
4 #include "jacobi.h"
5
6 int main(int argc, char* argv[])
7 {
8 // Namespace declarations
9 using std::cout;
10
11 // Define matrix size
12 Lengthtype msize = 6;
13 if (argc == 2) {
14 if ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0)…
15 cout << "Usage: " << argv[0] << " [matrix size]\n"
16 << "If matrix size is not specified, "
17 << "the matrix width and length will be "
18 << msize << ".\n";
19 return 1;
20 }
21 msize = atoi(argv[1]); // Use specified matrix size
22 }
23
24 // Calculate machine precision
25 Floattype eps = 1.0f;
26 while (1.0f + eps != 1.0f)
27 eps /= 2.0f;
28 //cout << "Machine precision of '" << typeid(eps).name()
29 // << "' type is: eps = " << eps << '\n';
30
31 Floattype checksum;
32 // Generate input matrix A, which is symmetric
33 cout << "\n\033[1;33m--- Input data check ---\033[0m\n";
34 arma::Mat<Floattype> A = symmatu(arma::randu< arma::Mat<Floattype> > (…
35 checksum = arma::sum(arma::sum(A - A.t()));
36 cout << "Symmetry check: A = A^T: ";
37 check(checksum < eps);
38 if (verbose == true) {
39 A.print("Original matrix:");
40 }
41
42 // Perform Jacobi diagonalization of matrix A
43 Jacobi Diag = Jacobi(A);
44
45 cout << "\n\033[1;33m--- Diagonalization check ---\033[0m\n";
46 if (verbose == true)
47 Diag.trans().print("Transformed matrix (At):");
48 cout << "Check: V V^T = 1: \t";
49 checksum = arma::sum(arma::sum(Diag.eigenvectors().t() * Diag.eigenvec…
50 check(fabs(checksum - (Floattype)msize) < eps*msize*msize);
51 if (verbose == true) {
52 Diag.eigenvalues().print("Eigenvalues (e):");
53 Diag.eigenvectors().print("Eigenvectors (V):");
54 Diag.eigenvectors().t().print("V^T");
55 (Diag.eigenvectors() * Diag.eigenvectors().t()).print("V V^T");
56 (Diag.eigenvectors().t() * A * Diag.eigenvectors()).print("V^T A V");
57 (Diag.eigenvectors().t() * Diag.trans() * Diag.eigenvectors()).print…
58 }
59
60 // Armadillo implementation
61 arma::Mat<Floattype> V_a (msize, msize);
62 arma::Col<Floattype> e_a (msize);
63 arma::eig_sym(e_a, V_a, A);
64 if (verbose == true) {
65 e_a.print("Armadillo eigenvalues:");
66 V_a.print("Armadillo eigenvectors:");
67 }
68 cout << "\n\033[1;33m--- Armadillo comparison ---\033[0m\n";
69 checksum = arma::sum(arma::sum(V_a - Diag.eigenvectors()));
70 cout << "Eigenvectors identical:\t";
71 check(checksum < eps*msize*msize*2);
72 checksum = arma::sum(arma::sum(e_a - Diag.eigenvalues()));
73 cout << "Eigenvalues identical: \t";
74 check(checksum < eps*msize*2);
75
76
77 // Return successfully
78 return 0;
79 }
80
81 void check(const bool statement)
82 {
83 using std::cout;
84 if (statement == true)
85 cout << "\t\033[0;32mPassed\033[0m\n";
86 else
87 cout << "\t\033[1;31mFail!!\033[0m\n";
88 }
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.