remove USING_PART_OF_NAMESPACE_EIGEN, leaving it in Eigen2Support.

improve porting-Eigen2-to-3 docs
This commit is contained in:
Benoit Jacob 2010-04-22 18:27:13 -04:00
parent ef789fe0d2
commit abbe260905
22 changed files with 114 additions and 124 deletions

View File

@ -58,4 +58,20 @@ namespace Eigen {
// Eigen2 used to include iostream // Eigen2 used to include iostream
#include<iostream> #include<iostream>
#define USING_PART_OF_NAMESPACE_EIGEN \
EIGEN_USING_MATRIX_TYPEDEFS \
using Eigen::Matrix; \
using Eigen::MatrixBase; \
using Eigen::ei_random; \
using Eigen::ei_real; \
using Eigen::ei_imag; \
using Eigen::ei_conj; \
using Eigen::ei_abs; \
using Eigen::ei_abs2; \
using Eigen::ei_sqrt; \
using Eigen::ei_exp; \
using Eigen::ei_log; \
using Eigen::ei_sin; \
using Eigen::ei_cos;
#endif // EIGEN2SUPPORT_H #endif // EIGEN2SUPPORT_H

View File

@ -105,22 +105,6 @@
#define EIGEN_DEBUG_VAR(x) std::cerr << #x << " = " << x << std::endl; #define EIGEN_DEBUG_VAR(x) std::cerr << #x << " = " << x << std::endl;
#define USING_PART_OF_NAMESPACE_EIGEN \
EIGEN_USING_MATRIX_TYPEDEFS \
using Eigen::Matrix; \
using Eigen::MatrixBase; \
using Eigen::ei_random; \
using Eigen::ei_real; \
using Eigen::ei_imag; \
using Eigen::ei_conj; \
using Eigen::ei_abs; \
using Eigen::ei_abs2; \
using Eigen::ei_sqrt; \
using Eigen::ei_exp; \
using Eigen::ei_log; \
using Eigen::ei_sin; \
using Eigen::ei_cos;
#ifdef NDEBUG #ifdef NDEBUG
# ifndef EIGEN_NO_DEBUG # ifndef EIGEN_NO_DEBUG
# define EIGEN_NO_DEBUG # define EIGEN_NO_DEBUG

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
using namespace Eigen; using namespace Eigen;
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#ifndef SIZE #ifndef SIZE
#define SIZE 1024 #define SIZE 1024

View File

@ -6,7 +6,7 @@
#include "BenchTimer.h" #include "BenchTimer.h"
using namespace std; using namespace std;
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#include <boost/preprocessor/repetition/enum_params.hpp> #include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition.hpp> #include <boost/preprocessor/repetition.hpp>

View File

@ -1,5 +1,5 @@
#include <Eigen/Core> #include <Eigen/Core>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
int main() int main()

View File

@ -6,7 +6,7 @@
#endif #endif
using namespace std; using namespace std;
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#ifndef REPEAT #ifndef REPEAT
#define REPEAT 40000000 #define REPEAT 40000000

View File

@ -3,7 +3,7 @@
#include <Eigen/Array> #include <Eigen/Array>
using namespace std; using namespace std;
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#ifndef REPEAT #ifndef REPEAT
#define REPEAT 10000 #define REPEAT 10000

View File

@ -2,7 +2,7 @@
#include <Eigen/Core> #include <Eigen/Core>
using namespace std; using namespace std;
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#ifndef MATTYPE #ifndef MATTYPE
#define MATTYPE MatrixXLd #define MATTYPE MatrixXLd

View File

@ -3,7 +3,7 @@
#include <Eigen/Core> #include <Eigen/Core>
using namespace std; using namespace std;
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#ifndef VECTYPE #ifndef VECTYPE
#define VECTYPE VectorXLd #define VECTYPE VectorXLd

View File

@ -1,6 +1,6 @@
#include <Eigen/Array> #include <Eigen/Array>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
#ifndef SCALAR #ifndef SCALAR
#define SCALAR float #define SCALAR float

View File

@ -1,5 +1,5 @@
#include <Eigen/Core> #include <Eigen/Core>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
template<typename Derived> template<typename Derived>

View File

@ -9,7 +9,7 @@
// #include "BenchTimer.h" // #include "BenchTimer.h"
// //
// using namespace std; // using namespace std;
// USING_PART_OF_NAMESPACE_EIGEN // using namespace Eigen;
// //
// enum {LazyEval, EarlyEval, OmpEval}; // enum {LazyEval, EarlyEval, OmpEval};
// //

View File

@ -7,82 +7,37 @@ and to help porting an application from Eigen2 to Eigen3.
\b Table \b of \b contents \b Table \b of \b contents
- \ref CompatibilitySupport - \ref CompatibilitySupport
- \ref ChangeList - \ref VectorBlocks
- \ref TriangularViews
- \ref TriangularSolveInPlace
- \ref Using
- \ref CoefficientWiseOperations - \ref CoefficientWiseOperations
- \ref Corners - \ref Corners
- \ref LazyVsNoalias - \ref LazyVsNoalias
\section CompatibilitySupport Eigen2 compatibility support \section CompatibilitySupport Eigen2 compatibility support
In order to ease the switch from Eigen2 to Eigen3, Eigen3 features a compatibility mode which can be enabled by defining the EIGEN2_SUPPORT preprocessor token \b before including any Eigen's header (typically it should be set in your project options). In order to ease the switch from Eigen2 to Eigen3, Eigen3 features a compatibility mode which can be enabled by defining the EIGEN2_SUPPORT preprocessor token \b before including any Eigen header (typically it should be set in your project options).
\section ChangeList List of changes in the API \section VectorBlocks Vector blocks
<table> <table>
<tr><td>Eigen 2</td><td>Eigen 3</td><td>Comments</td></tr> <tr><td>Eigen 2</td><td>Eigen 3</td></tr>
<tr><td>\code <tr><td>\code
vec.start(length) vector.start(length)
vec.start<length>() vector.start<length>()
vec.end(length) vector.end(length)
vec.end<length>() vector.end<length>()
\endcode</td><td>\code \endcode</td><td>\code
vec.head(length) vector.head(length)
vec.head<length>() vector.head<length>()
vec.tail(length) vector.tail(length)
vec.tail<length>() vector.tail<length>()
\endcode</td><td>Trivial "search and replace".</td></tr> \endcode</td></tr>
<tr><td colspan="3"></td></tr>
<tr><td>\code mat.cwise().XXX()\endcode</td><td>\code mat.array().XXX()\endcode</td><td>See \ref CoefficientWiseOperations. </td></tr>
<tr><td colspan="3"></td></tr>
<tr><td>\code c = (a * b).lazy();\endcode</td><td>\code c.noalias() = a * b;\endcode</td><td>See \ref LazyVsNoalias. </td></tr>
<tr><td colspan="3"></td></tr>
<tr><td>\code A.triangularSolveInPlace<XXX>(X);\endcode</td><td>\code A.triangularView<XXX>().solveInPlace(X);\endcode</td><td></td></tr>
<tr><td colspan="3"></td></tr>
<tr><td>\code
UpperTriangular
LowerTriangular
UnitUpperTriangular
UnitLowerTriangular
StrictlyUpperTriangular
StrictlyLowerTriangular
\endcode</td><td>\code
Upper
Lower
UnitUpper
UnitLower
StrictlyUpper
StrictlyLower
\endcode</td>
<td>Trivial "search and replace".</td></tr>
</table> </table>
\section CoefficientWiseOperations Coefficient wise operations
In Eigen2, coefficient wise operations which have no proper mathematical definition (as a coefficient wise product) \section Corners Matrix Corners
were achieved using the .cwise() prefix, e.g.:
\code a.cwise() * b \endcode
In Eigen3 this .cwise() prefix has been superseded by a new kind of matrix type called
Array for which all operations are performed coefficient wise. You can easily view a matrix as an array and vice versa using
the MatrixBase::array() and ArrayBase::matrix() functions respectively. Here is an example:
\code
Vector4f a, b, c;
c = a.array() * b.array();
\endcode
Note that the .array() function is not at all a synonym of the deprecated .cwise() prefix.
While the .cwise() prefix changed the behavior of the following operator, the array() function performs
a permanent conversion to the array world. Therefore, for binary operations such as the coefficient wise product,
both sides must be converted to an \em array as in the above example. On the other hand, when you
concatenate multiple coefficient wise operations you only have to do the conversion once, e.g.:
\code
Vector4f a, b, c;
c = a.array().abs().pow(3) * b.array().abs().sin();
\endcode
With Eigen2 you would have written:
\code
c = (a.cwise().abs().cwise().pow(3)).cwise() * (b.cwise().abs().cwise().sin());
\endcode
\section Corners Corners
<table> <table>
<tr><td>Eigen 2</td><td>Eigen 3</td></tr> <tr><td>Eigen 2</td><td>Eigen 3</td></tr>
@ -110,6 +65,69 @@ matrix.bottomRightCorner<r,c>()
Notice that Eigen3 also provides these new convenience methods: topRows(), bottomRows(), leftCols(), rightCols(). See in class DenseBase. Notice that Eigen3 also provides these new convenience methods: topRows(), bottomRows(), leftCols(), rightCols(). See in class DenseBase.
\section TriangularViews Triangular views
TODO: fill this section
\section TriangularSolveInPlace Triangular in-place solving
<table>
<tr><td>Eigen 2</td><td>Eigen 3</td></tr>
<tr><td>\code A.triangularSolveInPlace<XXX>(X);\endcode</td><td>\code A.triangularView<XXX>().solveInPlace(X);\endcode</td></tr>
<tr><td colspan="3"></td></tr>
<tr><td>\code
UpperTriangular
LowerTriangular
UnitUpperTriangular
UnitLowerTriangular
StrictlyUpperTriangular
StrictlyLowerTriangular
\endcode</td><td>\code
Upper
Lower
UnitUpper
UnitLower
StrictlyUpper
StrictlyLower
\endcode</td>
</tr>
</table>
\section Using The USING_PART_OF_NAMESPACE_EIGEN macro
The USING_PART_OF_NAMESPACE_EIGEN macro has been removed. In Eigen 3, just do:
\code
using namespace Eigen;
\endcode
\section CoefficientWiseOperations Coefficient wise operations
In Eigen2, coefficient wise operations which have no proper mathematical definition (as a coefficient wise product)
were achieved using the .cwise() prefix, e.g.:
\code a.cwise() * b \endcode
In Eigen3 this .cwise() prefix has been superseded by a new kind of matrix type called
Array for which all operations are performed coefficient wise. You can easily view a matrix as an array and vice versa using
the MatrixBase::array() and ArrayBase::matrix() functions respectively. Here is an example:
\code
Vector4f a, b, c;
c = a.array() * b.array();
\endcode
Note that the .array() function is not at all a synonym of the deprecated .cwise() prefix.
While the .cwise() prefix changed the behavior of the following operator, the array() function performs
a permanent conversion to the array world. Therefore, for binary operations such as the coefficient wise product,
both sides must be converted to an \em array as in the above example. On the other hand, when you
concatenate multiple coefficient wise operations you only have to do the conversion once, e.g.:
\code
Vector4f a, b, c;
c = a.array().abs().pow(3) * b.array().abs().sin();
\endcode
With Eigen2 you would have written:
\code
c = (a.cwise().abs().cwise().pow(3)).cwise() * (b.cwise().abs().cwise().sin());
\endcode
\section LazyVsNoalias Lazy evaluation and noalias \section LazyVsNoalias Lazy evaluation and noalias
In Eigen all operations are performed in a lazy fashion except the matrix products which are always evaluated into a temporary by default. In Eigen all operations are performed in a lazy fashion except the matrix products which are always evaluated into a temporary by default.

View File

@ -1,26 +0,0 @@
#include <Eigen/Core>
USING_PART_OF_NAMESPACE_EIGEN
using namespace std;
template<typename Scalar, typename Derived>
void foo(const MatrixBase<Scalar, Derived>& m)
{
cout << "Here's m:" << endl << m << endl;
}
template<typename Scalar, typename Derived>
Eigen::ScalarMultiple<Derived>
twice(const MatrixBase<Scalar, Derived>& m)
{
return 2 * m;
}
int main(int, char**)
{
Matrix2d m = Matrix2d::random();
foo(m);
foo(twice(m));
return 0;
}

View File

@ -1,8 +1,7 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
// import most common Eigen types using namespace Eigen;
USING_PART_OF_NAMESPACE_EIGEN
int main(int, char *[]) int main(int, char *[])
{ {

View File

@ -1,8 +1,7 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
// import most common Eigen types using namespace Eigen;
USING_PART_OF_NAMESPACE_EIGEN
int main(int, char *[]) int main(int, char *[])
{ {

View File

@ -1,6 +1,6 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
template<typename Derived> template<typename Derived>

View File

@ -1,6 +1,6 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
// define a custom template binary functor // define a custom template binary functor

View File

@ -1,6 +1,6 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
// define a custom template unary functor // define a custom template unary functor

View File

@ -1,6 +1,6 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
template<typename Derived> template<typename Derived>

View File

@ -1,6 +1,6 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
template<typename Derived> template<typename Derived>

View File

@ -1,6 +1,6 @@
#include <Eigen/Core> #include <Eigen/Core>
#include <iostream> #include <iostream>
USING_PART_OF_NAMESPACE_EIGEN using namespace Eigen;
using namespace std; using namespace std;
template<typename Derived> template<typename Derived>