0%

install and use eigen3 on ubuntu 16.04

Guide

install

1
sudo apt-get install libeigen3-dev

install to /usr/include/eigen3/ and /usr/lib/cmake/eigen3

1
ll /usr/lib/cmake/eigen3

Eigen3Config.cmake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#                                               -*- cmake -*-
#
# Eigen3Config.cmake(.in)

# Use the following variables to compile and link against Eigen:
# EIGEN3_FOUND - True if Eigen was found on your system
# EIGEN3_USE_FILE - The file making Eigen usable
# EIGEN3_DEFINITIONS - Definitions needed to build with Eigen
# EIGEN3_INCLUDE_DIR - Directory where signature_of_eigen3_matrix_library can be found
# EIGEN3_INCLUDE_DIRS - List of directories of Eigen and it's dependencies
# EIGEN3_ROOT_DIR - The base directory of Eigen
# EIGEN3_VERSION_STRING - A human-readable string containing the version
# EIGEN3_VERSION_MAJOR - The major version of Eigen
# EIGEN3_VERSION_MINOR - The minor version of Eigen
# EIGEN3_VERSION_PATCH - The patch version of Eigen

set ( EIGEN3_FOUND 1 )
set ( EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake" )

set ( EIGEN3_DEFINITIONS "" )
set ( EIGEN3_INCLUDE_DIR "/usr/include/eigen3" )
set ( EIGEN3_INCLUDE_DIRS "/usr/include/eigen3" )
set ( EIGEN3_ROOT_DIR "/usr" )

set ( EIGEN3_VERSION_STRING "3.2.92" )
set ( EIGEN3_VERSION_MAJOR "3" )
set ( EIGEN3_VERSION_MINOR "2" )
set ( EIGEN3_VERSION_PATCH "92" )

UseEigen3.cmake

1
2
3
4
5
6
# -*- cmake -*-
#
# UseEigen3.cmake

add_definitions ( ${EIGEN3_DEFINITIONS} )
include_directories ( ${EIGEN3_INCLUDE_DIRS} )

typedef

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef Matrix< std::complex<double> , 2 , 2 > Eigen::Matrix2cd
typedef Matrix< std::complex<float> , 2 , 2 > Eigen::Matrix2cf
typedef Matrix< double , 2 , 2 > Eigen::Matrix2d
typedef Matrix< float , 2 , 2 > Eigen::Matrix2f
typedef Matrix< int , 2 , 2 > Eigen::Matrix2i
typedef Matrix< std::complex<double> , 2 , Dynamic> Eigen::Matrix2Xcd
typedef Matrix< std::complex<float> , 2 , Dynamic> Eigen::Matrix2Xcf
typedef Matrix< double , 2 , Dynamic> Eigen::Matrix2Xd
typedef Matrix< float , 2 , Dynamic> Eigen::Matrix2Xf
typedef Matrix< int , 2 , Dynamic> Eigen::Matrix2Xi
typedef Matrix< std::complex<double> , 3 , 3 > Eigen::Matrix3cd
########
transpose 转置
conjugate 共轭
adjoint 伴随

Example

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 2.8)
project(Test)

find_package(Eigen3 REQUIRED)
MESSAGE( [Main] " EIGEN3_INCLUDE_DIRS = ${EIGEN3_INCLUDE_DIRS}")
# EIGEN3_INCLUDE_DIRS = /usr/include/eigen3

include_directories(${EIGEN3_INCLUDE_DIRS})

add_executable(main test.cpp)

No need to link libraries for eigen3.

c++ code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#include <Eigen/Dense>
using namespace Eigen;

void test0()
{
//------------------------
MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = -1;
m(1,1) = m(1,0) + m(0,1);
cout << "Here is the matrix m:\n" << m << endl;

VectorXd v(2);
v(0) = 4;
v(1) = v(0) - 1;
cout << "Here is the vector v:\n" << v << endl;

//------------------------
Matrix3f m2;
m2 << 1, 2, 3,
4, 5, 6,
7, 8, 9;
cout << m2 << endl;
}

void test1()
{
// stats
Eigen::Matrix2d mat;
mat << 1, 2,
3, 4;
cout << "Here is mat.sum(): " << mat.sum() << endl;
cout << "Here is mat.prod(): " << mat.prod() << endl;
cout << "Here is mat.mean(): " << mat.mean() << endl;
cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl; // min value = 1
cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl; // max value = 4
cout << "Here is mat.trace(): " << mat.trace() << endl; //
}

/*
Here is mat.sum(): 10
Here is mat.prod(): 24
Here is mat.mean(): 2.5
Here is mat.minCoeff(): 1
Here is mat.maxCoeff(): 4
Here is mat.trace(): 5
*/

void test2()
{
// l1-norm = |v1|+|v2|+...|vn|
// l2-norm = v1*v1 + v2*v2+...vn*vn squareNorm(), Norm()
// lpNorm< p >(): lpNorm< 1 >() lpNorm< 2 >()

VectorXf v(2);
MatrixXf m(2,2), n(2,2);

v << -1,
2;

m << 1,-2,
-3,4;
cout << "v.squaredNorm() = " << v.squaredNorm() << endl;
cout << "v.norm() = " << v.norm() << endl;
cout << "v.lpNorm<1>() = " << v.lpNorm<1>() << endl;
cout << "v.lpNorm<Infinity>() = " << v.lpNorm<Infinity>() << endl; // max value
cout << endl;
cout << "m.squaredNorm() = " << m.squaredNorm() << endl;
cout << "m.norm() = " << m.norm() << endl;
cout << "m.lpNorm<1>() = " << m.lpNorm<1>() << endl;
cout << "m.lpNorm<Infinity>() = " << m.lpNorm<Infinity>() << endl; // max value


n << 1,-2,
-3,4;
cout << "1-norm(n) = " << n.cwiseAbs().colwise().sum().maxCoeff()
<< " == " << n.colwise().lpNorm<1>().maxCoeff() << endl;
cout << "infty-norm(n) = " << n.cwiseAbs().rowwise().sum().maxCoeff()
<< " == " << n.rowwise().lpNorm<1>().maxCoeff() << endl;
}
/*
v.squaredNorm() = 5
v.norm() = 2.23607
v.lpNorm<1>() = 3
v.lpNorm<Infinity>() = 2

m.squaredNorm() = 30
m.norm() = 5.47723
m.lpNorm<1>() = 10
m.lpNorm<Infinity>() = 4


1-norm(n) = 6 == 6
infty-norm(n) = 7 == 7
*/


void test3()
{
// bool
ArrayXXf a(2,2);

a << 1,2,
3,4;
cout << "(a > 0).all() = " << (a > 0).all() << endl; // bool
cout << "(a > 0).any() = " << (a > 0).any() << endl; // bool
cout << "(a > 0).count() = " << (a > 0).count() << endl; // int
cout << endl;
cout << "(a > 2).all() = " << (a > 2).all() << endl;
cout << "(a > 2).any() = " << (a > 2).any() << endl;
cout << "(a > 2).count() = " << (a > 2).count() << endl;
}
/*
(a > 0).all() = 1
(a > 0).any() = 1
(a > 0).count() = 4

(a > 2).all() = 0
(a > 2).any() = 1
(a > 2).count() = 2
*/

void test4()
{
// get min/max index
Eigen::MatrixXf m(2,2);

m << 1, 2,
3, 4;

//get location of maximum
MatrixXf::Index maxRow, maxCol;
float max = m.maxCoeff(&maxRow, &maxCol);

//get location of minimum
MatrixXf::Index minRow, minCol;
float min = m.minCoeff(&minRow, &minCol);

cout << "Max: " << max << ", at: " << maxRow << "," << maxCol << endl;
cout << "Min: " << min << ", at: " << minRow << "," << minCol << endl;
}
/*
Max: 4, at: 1,1
Min: 1, at: 0,0
*/

void test5()
{
// colwise rowwise
Eigen::MatrixXf mat(2,4);
mat << 1, 2, 6, 9,
3, 1, 7, 2;

std::cout << "Column's maximum: " << std::endl
<< mat.colwise().maxCoeff() << std::endl;

std::cout << "Row's maximum: " << std::endl
<< mat.rowwise().maxCoeff() << std::endl;
}
/*
Column's maximum:
3 2 7 9
Row's maximum:
9
7
*/

void test6()
{
// colwise + max/min
MatrixXf mat(2,4);
mat << 1, 2, 6, 9,
3, 1, 7, 2;

MatrixXf::Index maxIndex;
float maxSum = mat.colwise().sum().maxCoeff(&maxIndex);

std::cout << "Maximum sum at position " << maxIndex << std::endl;
std::cout << "The corresponding vector is: " << std::endl;
std::cout << mat.col( maxIndex ) << std::endl;
std::cout << "And its sum is is: " << maxSum << std::endl;
}
/*
Maximum sum at position 2
The corresponding vector is:
6
7
And its sum is is: 13
*/

void test7()
{
// broadcast with vector
Eigen::MatrixXf mat(2,4);
Eigen::VectorXf v(2);

mat << 1, 2, 6, 9,
3, 1, 7, 2;

v << 0,
1;

//add v to each column of m
mat.colwise() += v;
//mat += v; // ERROR

std::cout << "Broadcasting result: " << std::endl;
std::cout << mat << std::endl;
}
/*
Broadcasting result:
1 2 6 9
4 2 8 3
*/

void test8()
{
Eigen::MatrixXf m(2,4);
Eigen::VectorXf v(2);

m << 1, 23, 6, 9,
3, 11, 7, 2;

v << 2,
3;
MatrixXf::Index index;
// find nearest neighbour
(m.colwise() - v).colwise().squaredNorm().minCoeff(&index);
cout << "Nearest neighbour is column " << index << ":" << endl;
cout << m.col(index) << endl;
}
/*
Nearest neighbour is column 0:
1
3
*/

void test_eigen3()
{
//test0();
//test1();
//test2();
//test3();
//test4();
//test5();
//test6();
//test7();
test8();
}

Reference

History

  • 20190315: created.