[CppAD] Eigen expressions with CppAD
Brad Bell
bradbell at seanet.com
Fri Dec 20 12:04:29 EST 2013
You can also find an example of this problem using g++ at
https://projects.coin-or.org/CppAD/browser/trunk/bug/eigen_mul.sh
I plan to eventually look into this, but not in the near future. If
some-one knows what the problem is, I would appreciate it.
Brad
On 12/18/2013 9:02 AM, Braun, Michael wrote:
> I'm not sure if this is an Eigen issue or a CppAD issue, but I am hoping someone on this list can help me narrow down this problem.
>
> One of the nice features about Eigen is that it can efficiently compute matrix expressions like MatrixXd C = A * B * A.transpose(). It appears that when using the CppAD::AD<double> type, I get a "use of overloaded operator '*' is ambiguous" error when compiling (with both clang and intel). Eigen does not want to multiply a return-type expression by a matrix. There are no problems when the base scalar type is double.
>
> I would greatly appreciate and suggestions, or other ideas about what is going on.
>
> Thanks.
>
>
> #include <Eigen/Core>
> #include <cppad/cppad.hpp>
> #include <cppad/example/cppad_eigen.hpp>
> #include <iostream>
>
> using Eigen::MatrixXd;
> using Eigen::Matrix;
> using Eigen::Dynamic;
> using std::cout;
> using Eigen::MatrixBase;
> typedef CppAD::AD<double> AScalar;
>
> template<typename T>
> void print_mat(const MatrixBase<T>& X){
>
> for (int i=0; i<X.rows(); i++) {
> for (int j=0; j<X.cols(); j++) {
> cout << CppAD::Value(X(i,j)) << "\t";
> }
> cout << "\n";
> }
> }
>
> int main() {
>
> Matrix<double, Dynamic, Dynamic> A1(3,3);
> Matrix<double, Dynamic, Dynamic> B1(3,3);
> Matrix<double, Dynamic, Dynamic> C1(3,3);
> Matrix<double, Dynamic, Dynamic> D1(3,3);
> Matrix<AScalar, Dynamic, Dynamic> A2(3,3);
> Matrix<AScalar, Dynamic, Dynamic> B2(3,3);
> Matrix<AScalar, Dynamic, Dynamic> C2(3,3);
> Matrix<AScalar, Dynamic, Dynamic> D2(3,3);
>
> A1 << 1,2,3,
> 0,4,5,
> 0,0,6;
>
> B1 << 2,4,6,
> 4,5,7,
> 6,7,1;
>
> A2 = A1.cast<AScalar>();
> B2 = B1.cast<AScalar>();
>
> // ABA' with Base = double. This works.
> C1 = A1 * B1 * A1.transpose();
> cout << "C1:\n" << C1 << "\n\n";
>
>
> // (AB)A' with Base = AD<double>. This works
> D2 = (A2 * B2).eval() * A2.transpose();
> cout << "D2:\n";
> print_mat(D2);
>
> // ABA' with Base = AD<double>. Does not compile.
> // "use of overloaded operator '*' is ambiguous" error.
> C2 = A2 * B2 * A2.transpose();
> cout << "C2:\n" << C2 << "\n\n";
>
> }
>
>
> --------------------------
> Michael Braun
> Associate Professor of Marketing
> Cox School of Business
> Southern Methodist University
> Dallas, TX 75275
> braunm at smu.edu
>
>
>
>
> _______________________________________________
> CppAD mailing list
> CppAD at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cppad
>
More information about the CppAD
mailing list