summaryrefslogtreecommitdiffhomepage
path: root/eigen/unsupported/doc/examples
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2016-09-18 12:42:15 +0200
committerStanislaw Halik <sthalik@misaki.pl>2016-11-02 15:12:04 +0100
commit44861dcbfeee041223c4aac1ee075e92fa4daa01 (patch)
tree6dfdfd9637846a7aedd71ace97d7d2ad366496d7 /eigen/unsupported/doc/examples
parentf3fe458b9e0a29a99a39d47d9a76dc18964b6fec (diff)
update
Diffstat (limited to 'eigen/unsupported/doc/examples')
-rw-r--r--eigen/unsupported/doc/examples/BVH_Example.cpp52
-rw-r--r--eigen/unsupported/doc/examples/CMakeLists.txt20
-rw-r--r--eigen/unsupported/doc/examples/FFT.cpp118
-rw-r--r--eigen/unsupported/doc/examples/MatrixExponential.cpp16
-rw-r--r--eigen/unsupported/doc/examples/MatrixFunction.cpp23
-rw-r--r--eigen/unsupported/doc/examples/MatrixLogarithm.cpp15
-rw-r--r--eigen/unsupported/doc/examples/MatrixPower.cpp16
-rw-r--r--eigen/unsupported/doc/examples/MatrixPower_optimal.cpp17
-rw-r--r--eigen/unsupported/doc/examples/MatrixSine.cpp20
-rw-r--r--eigen/unsupported/doc/examples/MatrixSinh.cpp20
-rw-r--r--eigen/unsupported/doc/examples/MatrixSquareRoot.cpp16
-rw-r--r--eigen/unsupported/doc/examples/PolynomialSolver1.cpp53
-rw-r--r--eigen/unsupported/doc/examples/PolynomialUtils1.cpp20
13 files changed, 406 insertions, 0 deletions
diff --git a/eigen/unsupported/doc/examples/BVH_Example.cpp b/eigen/unsupported/doc/examples/BVH_Example.cpp
new file mode 100644
index 0000000..6b6fac0
--- /dev/null
+++ b/eigen/unsupported/doc/examples/BVH_Example.cpp
@@ -0,0 +1,52 @@
+#include <Eigen/StdVector>
+#include <unsupported/Eigen/BVH>
+#include <iostream>
+
+using namespace Eigen;
+typedef AlignedBox<double, 2> Box2d;
+
+namespace Eigen {
+ namespace internal {
+ Box2d bounding_box(const Vector2d &v) { return Box2d(v, v); } //compute the bounding box of a single point
+ }
+}
+
+struct PointPointMinimizer //how to compute squared distances between points and rectangles
+{
+ PointPointMinimizer() : calls(0) {}
+ typedef double Scalar;
+
+ double minimumOnVolumeVolume(const Box2d &r1, const Box2d &r2) { ++calls; return r1.squaredExteriorDistance(r2); }
+ double minimumOnVolumeObject(const Box2d &r, const Vector2d &v) { ++calls; return r.squaredExteriorDistance(v); }
+ double minimumOnObjectVolume(const Vector2d &v, const Box2d &r) { ++calls; return r.squaredExteriorDistance(v); }
+ double minimumOnObjectObject(const Vector2d &v1, const Vector2d &v2) { ++calls; return (v1 - v2).squaredNorm(); }
+
+ int calls;
+};
+
+int main()
+{
+ typedef std::vector<Vector2d, aligned_allocator<Vector2d> > StdVectorOfVector2d;
+ StdVectorOfVector2d redPoints, bluePoints;
+ for(int i = 0; i < 100; ++i) { //initialize random set of red points and blue points
+ redPoints.push_back(Vector2d::Random());
+ bluePoints.push_back(Vector2d::Random());
+ }
+
+ PointPointMinimizer minimizer;
+ double minDistSq = std::numeric_limits<double>::max();
+
+ //brute force to find closest red-blue pair
+ for(int i = 0; i < (int)redPoints.size(); ++i)
+ for(int j = 0; j < (int)bluePoints.size(); ++j)
+ minDistSq = std::min(minDistSq, minimizer.minimumOnObjectObject(redPoints[i], bluePoints[j]));
+ std::cout << "Brute force distance = " << sqrt(minDistSq) << ", calls = " << minimizer.calls << std::endl;
+
+ //using BVH to find closest red-blue pair
+ minimizer.calls = 0;
+ KdBVH<double, 2, Vector2d> redTree(redPoints.begin(), redPoints.end()), blueTree(bluePoints.begin(), bluePoints.end()); //construct the trees
+ minDistSq = BVMinimize(redTree, blueTree, minimizer); //actual BVH minimization call
+ std::cout << "BVH distance = " << sqrt(minDistSq) << ", calls = " << minimizer.calls << std::endl;
+
+ return 0;
+}
diff --git a/eigen/unsupported/doc/examples/CMakeLists.txt b/eigen/unsupported/doc/examples/CMakeLists.txt
new file mode 100644
index 0000000..c47646d
--- /dev/null
+++ b/eigen/unsupported/doc/examples/CMakeLists.txt
@@ -0,0 +1,20 @@
+FILE(GLOB examples_SRCS "*.cpp")
+
+ADD_CUSTOM_TARGET(unsupported_examples)
+
+INCLUDE_DIRECTORIES(../../../unsupported ../../../unsupported/test)
+
+FOREACH(example_src ${examples_SRCS})
+ GET_FILENAME_COMPONENT(example ${example_src} NAME_WE)
+ ADD_EXECUTABLE(example_${example} ${example_src})
+ if(EIGEN_STANDARD_LIBRARIES_TO_LINK_TO)
+ target_link_libraries(example_${example} ${EIGEN_STANDARD_LIBRARIES_TO_LINK_TO})
+ endif()
+ ADD_CUSTOM_COMMAND(
+ TARGET example_${example}
+ POST_BUILD
+ COMMAND example_${example}
+ ARGS >${CMAKE_CURRENT_BINARY_DIR}/${example}.out
+ )
+ ADD_DEPENDENCIES(unsupported_examples example_${example})
+ENDFOREACH(example_src)
diff --git a/eigen/unsupported/doc/examples/FFT.cpp b/eigen/unsupported/doc/examples/FFT.cpp
new file mode 100644
index 0000000..fcbf812
--- /dev/null
+++ b/eigen/unsupported/doc/examples/FFT.cpp
@@ -0,0 +1,118 @@
+// To use the simple FFT implementation
+// g++ -o demofft -I.. -Wall -O3 FFT.cpp
+
+// To use the FFTW implementation
+// g++ -o demofft -I.. -DUSE_FFTW -Wall -O3 FFT.cpp -lfftw3 -lfftw3f -lfftw3l
+
+#ifdef USE_FFTW
+#include <fftw3.h>
+#endif
+
+#include <vector>
+#include <complex>
+#include <algorithm>
+#include <iterator>
+#include <iostream>
+#include <Eigen/Core>
+#include <unsupported/Eigen/FFT>
+
+using namespace std;
+using namespace Eigen;
+
+template <typename T>
+T mag2(T a)
+{
+ return a*a;
+}
+template <typename T>
+T mag2(std::complex<T> a)
+{
+ return norm(a);
+}
+
+template <typename T>
+T mag2(const std::vector<T> & vec)
+{
+ T out=0;
+ for (size_t k=0;k<vec.size();++k)
+ out += mag2(vec[k]);
+ return out;
+}
+
+template <typename T>
+T mag2(const std::vector<std::complex<T> > & vec)
+{
+ T out=0;
+ for (size_t k=0;k<vec.size();++k)
+ out += mag2(vec[k]);
+ return out;
+}
+
+template <typename T>
+vector<T> operator-(const vector<T> & a,const vector<T> & b )
+{
+ vector<T> c(a);
+ for (size_t k=0;k<b.size();++k)
+ c[k] -= b[k];
+ return c;
+}
+
+template <typename T>
+void RandomFill(std::vector<T> & vec)
+{
+ for (size_t k=0;k<vec.size();++k)
+ vec[k] = T( rand() )/T(RAND_MAX) - .5;
+}
+
+template <typename T>
+void RandomFill(std::vector<std::complex<T> > & vec)
+{
+ for (size_t k=0;k<vec.size();++k)
+ vec[k] = std::complex<T> ( T( rand() )/T(RAND_MAX) - .5, T( rand() )/T(RAND_MAX) - .5);
+}
+
+template <typename T_time,typename T_freq>
+void fwd_inv(size_t nfft)
+{
+ typedef typename NumTraits<T_freq>::Real Scalar;
+ vector<T_time> timebuf(nfft);
+ RandomFill(timebuf);
+
+ vector<T_freq> freqbuf;
+ static FFT<Scalar> fft;
+ fft.fwd(freqbuf,timebuf);
+
+ vector<T_time> timebuf2;
+ fft.inv(timebuf2,freqbuf);
+
+ long double rmse = mag2(timebuf - timebuf2) / mag2(timebuf);
+ cout << "roundtrip rmse: " << rmse << endl;
+}
+
+template <typename T_scalar>
+void two_demos(int nfft)
+{
+ cout << " scalar ";
+ fwd_inv<T_scalar,std::complex<T_scalar> >(nfft);
+ cout << " complex ";
+ fwd_inv<std::complex<T_scalar>,std::complex<T_scalar> >(nfft);
+}
+
+void demo_all_types(int nfft)
+{
+ cout << "nfft=" << nfft << endl;
+ cout << " float" << endl;
+ two_demos<float>(nfft);
+ cout << " double" << endl;
+ two_demos<double>(nfft);
+ cout << " long double" << endl;
+ two_demos<long double>(nfft);
+}
+
+int main()
+{
+ demo_all_types( 2*3*4*5*7 );
+ demo_all_types( 2*9*16*25 );
+ demo_all_types( 1024 );
+ return 0;
+}
diff --git a/eigen/unsupported/doc/examples/MatrixExponential.cpp b/eigen/unsupported/doc/examples/MatrixExponential.cpp
new file mode 100644
index 0000000..ebd3b96
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixExponential.cpp
@@ -0,0 +1,16 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ const double pi = std::acos(-1.0);
+
+ MatrixXd A(3,3);
+ A << 0, -pi/4, 0,
+ pi/4, 0, 0,
+ 0, 0, 0;
+ std::cout << "The matrix A is:\n" << A << "\n\n";
+ std::cout << "The matrix exponential of A is:\n" << A.exp() << "\n\n";
+}
diff --git a/eigen/unsupported/doc/examples/MatrixFunction.cpp b/eigen/unsupported/doc/examples/MatrixFunction.cpp
new file mode 100644
index 0000000..a4172e4
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixFunction.cpp
@@ -0,0 +1,23 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+std::complex<double> expfn(std::complex<double> x, int)
+{
+ return std::exp(x);
+}
+
+int main()
+{
+ const double pi = std::acos(-1.0);
+
+ MatrixXd A(3,3);
+ A << 0, -pi/4, 0,
+ pi/4, 0, 0,
+ 0, 0, 0;
+
+ std::cout << "The matrix A is:\n" << A << "\n\n";
+ std::cout << "The matrix exponential of A is:\n"
+ << A.matrixFunction(expfn) << "\n\n";
+}
diff --git a/eigen/unsupported/doc/examples/MatrixLogarithm.cpp b/eigen/unsupported/doc/examples/MatrixLogarithm.cpp
new file mode 100644
index 0000000..8c5d970
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixLogarithm.cpp
@@ -0,0 +1,15 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ using std::sqrt;
+ MatrixXd A(3,3);
+ A << 0.5*sqrt(2), -0.5*sqrt(2), 0,
+ 0.5*sqrt(2), 0.5*sqrt(2), 0,
+ 0, 0, 1;
+ std::cout << "The matrix A is:\n" << A << "\n\n";
+ std::cout << "The matrix logarithm of A is:\n" << A.log() << "\n";
+}
diff --git a/eigen/unsupported/doc/examples/MatrixPower.cpp b/eigen/unsupported/doc/examples/MatrixPower.cpp
new file mode 100644
index 0000000..2224524
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixPower.cpp
@@ -0,0 +1,16 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ const double pi = std::acos(-1.0);
+ Matrix3d A;
+ A << cos(1), -sin(1), 0,
+ sin(1), cos(1), 0,
+ 0 , 0 , 1;
+ std::cout << "The matrix A is:\n" << A << "\n\n"
+ "The matrix power A^(pi/4) is:\n" << A.pow(pi/4) << std::endl;
+ return 0;
+}
diff --git a/eigen/unsupported/doc/examples/MatrixPower_optimal.cpp b/eigen/unsupported/doc/examples/MatrixPower_optimal.cpp
new file mode 100644
index 0000000..86470ba
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixPower_optimal.cpp
@@ -0,0 +1,17 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ Matrix4cd A = Matrix4cd::Random();
+ MatrixPower<Matrix4cd> Apow(A);
+
+ std::cout << "The matrix A is:\n" << A << "\n\n"
+ "A^3.1 is:\n" << Apow(3.1) << "\n\n"
+ "A^3.3 is:\n" << Apow(3.3) << "\n\n"
+ "A^3.7 is:\n" << Apow(3.7) << "\n\n"
+ "A^3.9 is:\n" << Apow(3.9) << std::endl;
+ return 0;
+}
diff --git a/eigen/unsupported/doc/examples/MatrixSine.cpp b/eigen/unsupported/doc/examples/MatrixSine.cpp
new file mode 100644
index 0000000..9eea9a0
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixSine.cpp
@@ -0,0 +1,20 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ MatrixXd A = MatrixXd::Random(3,3);
+ std::cout << "A = \n" << A << "\n\n";
+
+ MatrixXd sinA = A.sin();
+ std::cout << "sin(A) = \n" << sinA << "\n\n";
+
+ MatrixXd cosA = A.cos();
+ std::cout << "cos(A) = \n" << cosA << "\n\n";
+
+ // The matrix functions satisfy sin^2(A) + cos^2(A) = I,
+ // like the scalar functions.
+ std::cout << "sin^2(A) + cos^2(A) = \n" << sinA*sinA + cosA*cosA << "\n\n";
+}
diff --git a/eigen/unsupported/doc/examples/MatrixSinh.cpp b/eigen/unsupported/doc/examples/MatrixSinh.cpp
new file mode 100644
index 0000000..f771867
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixSinh.cpp
@@ -0,0 +1,20 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ MatrixXf A = MatrixXf::Random(3,3);
+ std::cout << "A = \n" << A << "\n\n";
+
+ MatrixXf sinhA = A.sinh();
+ std::cout << "sinh(A) = \n" << sinhA << "\n\n";
+
+ MatrixXf coshA = A.cosh();
+ std::cout << "cosh(A) = \n" << coshA << "\n\n";
+
+ // The matrix functions satisfy cosh^2(A) - sinh^2(A) = I,
+ // like the scalar functions.
+ std::cout << "cosh^2(A) - sinh^2(A) = \n" << coshA*coshA - sinhA*sinhA << "\n\n";
+}
diff --git a/eigen/unsupported/doc/examples/MatrixSquareRoot.cpp b/eigen/unsupported/doc/examples/MatrixSquareRoot.cpp
new file mode 100644
index 0000000..88e7557
--- /dev/null
+++ b/eigen/unsupported/doc/examples/MatrixSquareRoot.cpp
@@ -0,0 +1,16 @@
+#include <unsupported/Eigen/MatrixFunctions>
+#include <iostream>
+
+using namespace Eigen;
+
+int main()
+{
+ const double pi = std::acos(-1.0);
+
+ MatrixXd A(2,2);
+ A << cos(pi/3), -sin(pi/3),
+ sin(pi/3), cos(pi/3);
+ std::cout << "The matrix A is:\n" << A << "\n\n";
+ std::cout << "The matrix square root of A is:\n" << A.sqrt() << "\n\n";
+ std::cout << "The square of the last matrix is:\n" << A.sqrt() * A.sqrt() << "\n";
+}
diff --git a/eigen/unsupported/doc/examples/PolynomialSolver1.cpp b/eigen/unsupported/doc/examples/PolynomialSolver1.cpp
new file mode 100644
index 0000000..cd777a4
--- /dev/null
+++ b/eigen/unsupported/doc/examples/PolynomialSolver1.cpp
@@ -0,0 +1,53 @@
+#include <unsupported/Eigen/Polynomials>
+#include <vector>
+#include <iostream>
+
+using namespace Eigen;
+using namespace std;
+
+int main()
+{
+ typedef Matrix<double,5,1> Vector5d;
+
+ Vector5d roots = Vector5d::Random();
+ cout << "Roots: " << roots.transpose() << endl;
+ Eigen::Matrix<double,6,1> polynomial;
+ roots_to_monicPolynomial( roots, polynomial );
+
+ PolynomialSolver<double,5> psolve( polynomial );
+ cout << "Complex roots: " << psolve.roots().transpose() << endl;
+
+ std::vector<double> realRoots;
+ psolve.realRoots( realRoots );
+ Map<Vector5d> mapRR( &realRoots[0] );
+ cout << "Real roots: " << mapRR.transpose() << endl;
+
+ cout << endl;
+ cout << "Illustration of the convergence problem with the QR algorithm: " << endl;
+ cout << "---------------------------------------------------------------" << endl;
+ Eigen::Matrix<float,7,1> hardCase_polynomial;
+ hardCase_polynomial <<
+ -0.957, 0.9219, 0.3516, 0.9453, -0.4023, -0.5508, -0.03125;
+ cout << "Hard case polynomial defined by floats: " << hardCase_polynomial.transpose() << endl;
+ PolynomialSolver<float,6> psolvef( hardCase_polynomial );
+ cout << "Complex roots: " << psolvef.roots().transpose() << endl;
+ Eigen::Matrix<float,6,1> evals;
+ for( int i=0; i<6; ++i ){ evals[i] = std::abs( poly_eval( hardCase_polynomial, psolvef.roots()[i] ) ); }
+ cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl;
+
+ cout << "Using double's almost always solves the problem for small degrees: " << endl;
+ cout << "-------------------------------------------------------------------" << endl;
+ PolynomialSolver<double,6> psolve6d( hardCase_polynomial.cast<double>() );
+ cout << "Complex roots: " << psolve6d.roots().transpose() << endl;
+ for( int i=0; i<6; ++i )
+ {
+ std::complex<float> castedRoot( psolve6d.roots()[i].real(), psolve6d.roots()[i].imag() );
+ evals[i] = std::abs( poly_eval( hardCase_polynomial, castedRoot ) );
+ }
+ cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl;
+
+ cout.precision(10);
+ cout << "The last root in float then in double: " << psolvef.roots()[5] << "\t" << psolve6d.roots()[5] << endl;
+ std::complex<float> castedRoot( psolve6d.roots()[5].real(), psolve6d.roots()[5].imag() );
+ cout << "Norm of the difference: " << std::abs( psolvef.roots()[5] - castedRoot ) << endl;
+}
diff --git a/eigen/unsupported/doc/examples/PolynomialUtils1.cpp b/eigen/unsupported/doc/examples/PolynomialUtils1.cpp
new file mode 100644
index 0000000..dbfe520
--- /dev/null
+++ b/eigen/unsupported/doc/examples/PolynomialUtils1.cpp
@@ -0,0 +1,20 @@
+#include <unsupported/Eigen/Polynomials>
+#include <iostream>
+
+using namespace Eigen;
+using namespace std;
+
+int main()
+{
+ Vector4d roots = Vector4d::Random();
+ cout << "Roots: " << roots.transpose() << endl;
+ Eigen::Matrix<double,5,1> polynomial;
+ roots_to_monicPolynomial( roots, polynomial );
+ cout << "Polynomial: ";
+ for( int i=0; i<4; ++i ){ cout << polynomial[i] << ".x^" << i << "+ "; }
+ cout << polynomial[4] << ".x^4" << endl;
+ Vector4d evaluation;
+ for( int i=0; i<4; ++i ){
+ evaluation[i] = poly_eval( polynomial, roots[i] ); }
+ cout << "Evaluation of the polynomial at the roots: " << evaluation.transpose();
+}