blob: b83ca9af9f68e472ad0cd7dd722a262151cdd0d3 [file] [log] [blame]
Dean Moldovan67b52d82016-10-16 19:12:43 +02001Eigen
2=====
3
4`Eigen <http://eigen.tuxfamily.org>`_ is C++ header-based library for dense and
5sparse linear algebra. Due to its popularity and widespread adoption, pybind11
6provides transparent conversion support between Eigen and Scientific Python linear
7algebra data types.
8
9Specifically, when including the optional header file :file:`pybind11/eigen.h`,
10pybind11 will automatically and transparently convert
11
121. Static and dynamic Eigen dense vectors and matrices to instances of
13 ``numpy.ndarray`` (and vice versa).
14
152. Returned matrix expressions such as blocks (including columns or rows) and
16 diagonals will be converted to ``numpy.ndarray`` of the expression
17 values.
18
193. Returned matrix-like objects such as Eigen::DiagonalMatrix or
20 Eigen::SelfAdjointView will be converted to ``numpy.ndarray`` containing the
21 expressed value.
22
234. Eigen sparse vectors and matrices to instances of
24 ``scipy.sparse.csr_matrix``/``scipy.sparse.csc_matrix`` (and vice versa).
25
26This makes it possible to bind most kinds of functions that rely on these types.
27One major caveat are functions that take Eigen matrices *by reference* and modify
28them somehow, in which case the information won't be propagated to the caller.
29
30.. code-block:: cpp
31
32 /* The Python bindings of these functions won't replicate
33 the intended effect of modifying the function arguments */
34 void scale_by_2(Eigen::Vector3f &v) {
35 v *= 2;
36 }
37 void scale_by_2(Eigen::Ref<Eigen::MatrixXd> &v) {
38 v *= 2;
39 }
40
41To see why this is, refer to the section on :ref:`opaque` (although that
42section specifically covers STL data types, the underlying issue is the same).
43The :ref:`numpy` sections discuss an efficient alternative for exposing the
44underlying native Eigen types as opaque objects in a way that still integrates
45with NumPy and SciPy.
46
47.. seealso::
48
49 The file :file:`tests/test_eigen.cpp` contains a complete example that
50 shows how to pass Eigen sparse and dense data types in more detail.