source: pacpussensors/trunk/Vislab/lib3dv/eigen/unsupported/bench/bench_svd.cpp@ 136

Last change on this file since 136 was 136, checked in by ldecherf, 7 years ago

Doc

File size: 3.8 KB
Line 
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2013 Gauthier Brun <brun.gauthier@gmail.com>
5// Copyright (C) 2013 Nicolas Carre <nicolas.carre@ensimag.fr>
6// Copyright (C) 2013 Jean Ceccato <jean.ceccato@ensimag.fr>
7// Copyright (C) 2013 Pierre Zoppitelli <pierre.zoppitelli@ensimag.fr>
8//
9// This Source Code Form is subject to the terms of the Mozilla
10// Public License v. 2.0. If a copy of the MPL was not distributed
11// with this file, You can obtain one at http://mozilla.org/MPL/2.0/
12
13// Bench to compare the efficiency of SVD algorithms
14
15#include <iostream>
16#include <bench/BenchTimer.h>
17#include <unsupported/Eigen/SVD>
18
19
20using namespace Eigen;
21using namespace std;
22
23// number of computations of each algorithm before the print of the time
24#ifndef REPEAT
25#define REPEAT 10
26#endif
27
28// number of tests of the same type
29#ifndef NUMBER_SAMPLE
30#define NUMBER_SAMPLE 2
31#endif
32
33template<typename MatrixType>
34void bench_svd(const MatrixType& a = MatrixType())
35{
36 MatrixType m = MatrixType::Random(a.rows(), a.cols());
37 BenchTimer timerJacobi;
38 BenchTimer timerBDC;
39 timerJacobi.reset();
40 timerBDC.reset();
41
42 cout << " Only compute Singular Values" <<endl;
43 for (int k=1; k<=NUMBER_SAMPLE; ++k)
44 {
45 timerBDC.start();
46 for (int i=0; i<REPEAT; ++i)
47 {
48 BDCSVD<MatrixType> bdc_matrix(m);
49 }
50 timerBDC.stop();
51
52 timerJacobi.start();
53 for (int i=0; i<REPEAT; ++i)
54 {
55 JacobiSVD<MatrixType> jacobi_matrix(m);
56 }
57 timerJacobi.stop();
58
59
60 cout << "Sample " << k << " : " << REPEAT << " computations : Jacobi : " << fixed << timerJacobi.value() << "s ";
61 cout << " || " << " BDC : " << timerBDC.value() << "s " <<endl <<endl;
62
63 if (timerBDC.value() >= timerJacobi.value())
64 cout << "KO : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
65 else
66 cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
67
68 }
69 cout << " =================" <<endl;
70 std::cout<< std::endl;
71 timerJacobi.reset();
72 timerBDC.reset();
73 cout << " Computes rotaion matrix" <<endl;
74 for (int k=1; k<=NUMBER_SAMPLE; ++k)
75 {
76 timerBDC.start();
77 for (int i=0; i<REPEAT; ++i)
78 {
79 BDCSVD<MatrixType> bdc_matrix(m, ComputeFullU|ComputeFullV);
80 }
81 timerBDC.stop();
82
83 timerJacobi.start();
84 for (int i=0; i<REPEAT; ++i)
85 {
86 JacobiSVD<MatrixType> jacobi_matrix(m, ComputeFullU|ComputeFullV);
87 }
88 timerJacobi.stop();
89
90
91 cout << "Sample " << k << " : " << REPEAT << " computations : Jacobi : " << fixed << timerJacobi.value() << "s ";
92 cout << " || " << " BDC : " << timerBDC.value() << "s " <<endl <<endl;
93
94 if (timerBDC.value() >= timerJacobi.value())
95 cout << "KO : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
96 else
97 cout << "OK : BDC is " << timerJacobi.value() / timerBDC.value() << " times faster than Jacobi" <<endl;
98
99 }
100 std::cout<< std::endl;
101}
102
103
104
105int main(int argc, char* argv[])
106{
107 std::cout<< std::endl;
108
109 std::cout<<"On a (Dynamic, Dynamic) (6, 6) Matrix" <<std::endl;
110 bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(6, 6));
111
112 std::cout<<"On a (Dynamic, Dynamic) (32, 32) Matrix" <<std::endl;
113 bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(32, 32));
114
115 //std::cout<<"On a (Dynamic, Dynamic) (128, 128) Matrix" <<std::endl;
116 //bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(128, 128));
117
118 std::cout<<"On a (Dynamic, Dynamic) (160, 160) Matrix" <<std::endl;
119 bench_svd<Matrix<double,Dynamic,Dynamic> >(Matrix<double,Dynamic,Dynamic>(160, 160));
120
121 std::cout<< "--------------------------------------------------------------------"<< std::endl;
122
123}
Note: See TracBrowser for help on using the repository browser.