non identity information matrix using auto differentiation

360 views
Skip to first unread message

phreak...@gmail.com

unread,
Sep 18, 2017, 4:52:42 PM9/18/17
to Ceres Solver
Hi,
I'm trying to use existing 3D point covariance information in my reprojection error functor (by projecting the 3D covariance to 2D first) in order to obtain an information matrix weighing the residual (as explained in http://ceres-solver.org/nnls_covariance.html).
I'm not really sure though, how should I consider the auto differentiation type T for this part of the computation (mainly because I'm not really sure about how it works specifically). 
Since in my cost function I'm minimizing the camera pose w.r.t. to a fixed point cloud (only tracking, not full BA), the information matrix computation requires the camera pose as input (specifically, its orientation). Since the orientation is templated with type T (a 3D rottion matrix),
right now I wrote the information matrix computation function also as a templated function of type T. However, this does not seem to compile. In any case, I'm not really sure if this is expected since, to me, the covariance should be always a real-value since it should not affect how the derivative of the cost function is found, right? In that case, I would need to cast T to double which feels wrong.

This is my cost function so far (not compiling):

    template <typename T>
    bool operator()(const T* const pose,
                    T* residuals) const
    {
      /* apply rotation and translation to 3D point */
      Eigen::Matrix<T,3,1> transformed_point;

      /* perform R^t (x - T) */
      Eigen::Map<const Eigen::Matrix<T,3,1>> translation(&pose[4]);
      Eigen::Matrix<T, 3, 1> translated_point = Eigen::Matrix<T,3,1>(point.cast<T>()) - translation;

      Eigen::Matrix<T, 3, 3> orientation;
      ceres::QuaternionToRotation(pose, orientation.data());
      transformed_point = orientation.transpose() * translated_point;

      /* project to image */
      Eigen::Matrix<T,2,1> projection;
      projection(0) = (transformed_point(0) * fx) / transformed_point(2) + cx;
      projection(1) = (transformed_point(1) * fy) / transformed_point(2) + cy;

      /* compute reprojection error */
      Eigen::Map<Eigen::Matrix<T,2,1>> residuals_eigen(residuals);
      residuals_eigen = projection - feature.cast<T>();

      /* compute observation information matrix */
      double pixel_noise = 1;
      pixel_noise *= pixel_noise;
      Eigen::DiagonalMatrix<double, 2> feature_noise; feature_noise.diagonal() << pixel_noise, pixel_noise;

      Eigen::Matrix<T, 2, 2> projected_covariance = vtnr::FeatureHandler::projection_covariance(transformed_point, Eigen::Matrix<T,3,3>(point_covariance.cast<T>()), orientation, fx, fy);

      Eigen::Matrix<T, 2, 2> observation_covariance = Eigen::Matrix<double,2,2>(feature_noise).cast<T>() + projected_covariance;

      /* compute inverse square root of covariance matrix to obtain the factor to multiply the residual with */
      // TODO: this can probably be done in a more stabler and efficient way
      Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T,2,2>> eigen_solver(observation_covariance);
      Eigen::Matrix<T,2,2> information(eigen_solver.operatorInverseSqrt());

      //Eigen::LLT<information_t> lltOfInformation(information_);
      //squareRootInformation_ = lltOfInformation.matrixL().transpose();
      residuals_eigen = information * residuals_eigen;
      return true;
  }

The error I'm getting is:

In file included from /usr/include/eigen3/Eigen/Eigenvalues:38:0,

from /usr/include/eigen3/Eigen/Dense:7,

from /usr/include/ceres/internal/numeric_diff.h:40,

from /usr/include/ceres/dynamic_numeric_diff_cost_function.h:44,

from /usr/include/ceres/ceres.h:44,

from /home/v01d/ros/src/vtnr/src/vtnr_minimization.cpp:1:

/usr/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h: In instantiation of ‘Eigen::ComputationInfo Eigen::internal::computeFromTridiagonal_impl(DiagType&, SubDiagType&, Eigen::Index, bool, MatrixType&) [with MatrixType = Eigen::Matrix<ceres::Jet<double, 7>, 2, 2, 0, 2, 2>; DiagType = Eigen::Matrix<ceres::Jet<double, 7>, 2, 1, 0, 2, 1>; SubDiagType = Eigen::Matrix<ceres::Jet<double, 7>, 1, 1, 0, 1, 1>; Eigen::Index = long int]’:

/usr/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h:435:49: required from ‘Eigen::SelfAdjointEigenSolver<MatrixType>& Eigen::SelfAdjointEigenSolver<_MatrixType>::compute(const Eigen::EigenBase<OtherDerived>&, int) [with InputType = Eigen::Matrix<ceres::Jet<double, 7>, 2, 2, 0, 2, 2>; _MatrixType = Eigen::Matrix<ceres::Jet<double, 7>, 2, 2, 0, 2, 2>]’

/usr/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h:168:14: required from ‘Eigen::SelfAdjointEigenSolver<_MatrixType>::SelfAdjointEigenSolver(const Eigen::EigenBase<OtherDerived>&, int) [with InputType = Eigen::Matrix<ceres::Jet<double, 7>, 2, 2, 0, 2, 2>; _MatrixType = Eigen::Matrix<ceres::Jet<double, 7>, 2, 2, 0, 2, 2>]’

/home/v01d/ros/src/vtnr/src/vtnr_minimization.cpp:70:94: required from ‘bool StereoReprojectionError::operator()(const T*, T*) const [with T = ceres::Jet<double, 7>]’

/usr/include/ceres/internal/variadic_evaluate.h:175:19: required from ‘static bool ceres::internal::VariadicEvaluate<Functor, T, N0, 0, 0, 0, 0, 0, 0, 0, 0, 0>::Call(const Functor&, const T* const*, T*) [with Functor = StereoReprojectionError; T = ceres::Jet<double, 7>; int N0 = 7]’

/usr/include/ceres/internal/autodiff.h:282:72: required from ‘static bool ceres::internal::AutoDiff<Functor, T, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Differentiate(const Functor&, const T* const*, int, T*, T**) [with Functor = StereoReprojectionError; T = double; int N0 = 7; int N1 = 0; int N2 = 0; int N3 = 0; int N4 = 0; int N5 = 0; int N6 = 0; int N7 = 0; int N8 = 0; int N9 = 0]’

/usr/include/ceres/autodiff_cost_function.h:211:66: required from ‘bool ceres::AutoDiffCostFunction<CostFunctor, kNumResiduals, N0, N1, N2, N3, N4, N5, N6, N7, N8, N9>::Evaluate(const double* const*, double*, double**) const [with CostFunctor = StereoReprojectionError; int kNumResiduals = 2; int N0 = 7; int N1 = 0; int N2 = 0; int N3 = 0; int N4 = 0; int N5 = 0; int N6 = 0; int N7 = 0; int N8 = 0; int N9 = 0]’

/home/v01d/ros/src/vtnr/src/vtnr_minimization.cpp:149:1: required from here

/usr/include/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h:496:20: error: no match for ‘operator=’ (operand types are ‘Eigen::DenseCoeffsBase<Eigen::Matrix<ceres::Jet<double, 7>, 1, 1, 0, 1, 1>, 1>::Scalar {aka ceres::Jet<double, 7>}’ and ‘int’)

subdiag[i] = 0;

Sameer Agarwal

unread,
Sep 18, 2017, 6:03:40 PM9/18/17
to ceres-...@googlegroups.com
don't compute the square root of the matrix while computing the residual.  store it precomputed. This computation and storage is in doubles.  and then just multiply it into the residual before returning. where as part of multiplying you can cast it to T.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/aa525e90-317b-4e64-b85c-e4de981e4949%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Matias v01d

unread,
Sep 18, 2017, 6:31:34 PM9/18/17
to ceres-...@googlegroups.com
The problem is that, as I mentioned, this calculation depends on the current value of the pose being minimized (ie. I need my current pose to project the 3d covariance to a 2d covariance). And this pose is of type T.

To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/CABqdRUAJPH7ZJwjKeZPCD_B0dam89tZnM-6SP4AG-f7brrA87w%40mail.gmail.com.

Sameer Agarwal

unread,
Sep 18, 2017, 6:57:19 PM9/18/17
to ceres-...@googlegroups.com
sorry for not understanding your problem fully.

so let me see if I understand this correctly, you have 3d points which you know with some certainty, and you have covariances associated with them.

you must also have image space observations of the same points, which presumably also have some uncertainty/covariance associate with them.

and now you are trying to estimate the pose of camera given this information? 

so what you are really trying to do here, is match the projection of number of 3d gaussians with their 2d observations?

can you describe algebraically the error you are trying to minimize in terms of these quantities?

Sameer



To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/CAJw%3DTtokMPoFDDFt0xsTW4M8VY8R3LJAf20M4cmx4c2_nDVo3Q%40mail.gmail.com.

Matias v01d

unread,
Sep 18, 2017, 7:48:27 PM9/18/17
to ceres-...@googlegroups.com
I have a point cloud (3D points) with their 3D covariances. My cost function is a standard reprojection error which measures distance (in 2D) between observed 2D point and 3D -> 2D projected point from the cloud. I want to weigh this residual using the 3D covariance projected towards the 2D image. This is done by using the jacobian of the projection function and thus with a standard covariance propagation. In the end I have a 2D covariance (the result of the projection) which is what I would invert and use as information matrix.
The difficulty lies in the fact that this propagation requires to use the current pose of the camera w.r.t. to the points. The projection looks something like this:

C_2d = J * C_3d * J'

where

J = J_g * R

is the jacobian of the 3D->2D projection function. R is the orientation of the camera (this is actually the jacobian of the 3D->3D transform which is required to first put points in the camera frame).
 

To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/CABqdRUBQ915wyPTQ3hyiv%3D37aD%3D%3DGqbwqgYvWthdJ33%3DpAqarQ%40mail.gmail.com.

phreak...@gmail.com

unread,
Sep 19, 2017, 10:06:42 AM9/19/17
to Ceres Solver
If my use case is still unclear maybe I can ask how the auto differentiation actually works, so that I can find a solution for my particular case. Does the auto-differentiation need to have the residuals weighted the same both when evaluated with T=double and T=Jet? If it is only needed when T=double, maybe I can test for this case (I think it can be done) and safely cast T->double. Another situation, if the weighing needs to happen in both cases, could be if I new T will be evaluated as double always before being evaluated with Jet. In this case I can cache the information matrix as suggested as double and apply it when T=Jet. 

phreak...@gmail.com

unread,
Sep 19, 2017, 10:45:31 AM9/19/17
to Ceres Solver
Well I just tested the aforementioned idea of caching the information matrix and does not seem feasible since it seems T=Jet can be called before T=double for some reason. I think I will simply compute the covariance based on the prior used as input to the minimization and not attempt to use the current value of the pose during minimization. Should not affect much.

phreak...@gmail.com

unread,
Sep 19, 2017, 11:08:00 AM9/19/17
to Ceres Solver
Sorry for spamming but I have a final question (since pre-computing the information matrix leads to other complications for me), what If I were to perform the information matrix computation by taking the real part of the Jet? As I understand, the information matrix should be a scalar weight for the purpose of the cost function so thinking about this I think it would make sense. In other words, it should provide the same result when T=double and T=Jet, right?

Sameer Agarwal

unread,
Sep 20, 2017, 3:32:10 PM9/20/17
to ceres-...@googlegroups.com
You can't access the jacobian while doing automatic differentiation.
What I would recommend doing in this case is creating a CostFunction yourself, which uses the underlying autodiff machinery to compute the Jacobian and uses it.
Sameer


To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/6c56113c-8f8c-47ca-b8ed-d58b1af06c05%40googlegroups.com.

Sameer Agarwal

unread,
Sep 20, 2017, 3:32:23 PM9/20/17
to ceres-...@googlegroups.com
Thanks Matias.


On Mon, Sep 18, 2017 at 4:48 PM Matias v01d <phreak...@gmail.com> wrote:
I have a point cloud (3D points) with their 3D covariances. My cost function is a standard reprojection error which measures distance (in 2D) between observed 2D point and 3D -> 2D projected point from the cloud. I want to weigh this residual using the 3D covariance projected towards the 2D image. This is done by using the jacobian of the projection function and thus with a standard covariance propagation. In the end I have a 2D covariance (the result of the projection) which is what I would invert and use as information matrix.

I do not think this is the right error function. You are matching the means of two distributions (image space observations and the projection of the point) and just weighting it by the inverse of the uncertainty of the point. You should treat both of these (the image observation and the projected point) as two normal distributions and find the distance between them. 

 
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/CAJw%3DTtpMMfa-%2BcrirLBC0OuVYwVmf4jtvcNi69%2Bj17RfGYF0VA%40mail.gmail.com.

Matias v01d

unread,
Sep 20, 2017, 3:50:51 PM9/20/17
to ceres-...@googlegroups.com
Great, that is indeed another solution.
And what about taking the real part of the Jet type? Would that be correct?

To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver+unsubscribe@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/CABqdRUDzsFJWQ%3DarXnvv5frK%2B5UgeWm3PjL3MutVd47LUUKSuQ%40mail.gmail.com.

Sameer Agarwal

unread,
Sep 20, 2017, 3:52:34 PM9/20/17
to ceres-...@googlegroups.com
No, please do not touch the jet, much misery and incorrect code likes that path, and also the real part does not contain the derivatives.
Sameer

To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.

--
You received this message because you are subscribed to a topic in the Google Groups "Ceres Solver" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/ceres-solver/UJU6tfBHqq0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to ceres-solver...@googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ceres-solver/CAJw%3DTtoC1snMb3ELF_jdA__kEQhJuvw0v9ATVFwUNAYNJXryBA%40mail.gmail.com.

phreak...@gmail.com

unread,
Sep 21, 2017, 10:45:34 AM9/21/17
to Ceres Solver
Hi,
I'm trying to consider this option and I understand your idea would be to reproduce the functionality of the AutoDiffCostFunction but with an extra call to first compute the information matrix based on the current value of my parameters.
I don't really understand how should I implement this since it would seem that jacobians can be either expected or not at a given time and this is what triggers either the standard evaluate() call to the cost function functor, or to the auto differentiation
machinery. So in the case where Jacobians would be expected, how should I deal with this?

In any case, when jacobians are expected I (think I) understand from the Differentiate() function that the Jet variables are first built, then used to invoke the cost functor and from that the real valued part is used to update the residual and the non-real valued part to obtain the jacobians. So, sorry for insisting in my idea of taking the real part of the parameters when I receive a Jet in my function, but wouldn't it what it is actually happening here? In case I wasn't clear before, I'm not talking about modifying the Jet or accessing the jacobians, but to used the real-valued part of the Jet to compute my information matrix, as if I were receiving a double value directly and do everything else the same. I have this implemented and would seem to work, but it is difficult to be sure about that.

Sameer Agarwal

unread,
Sep 26, 2017, 8:20:46 AM9/26/17
to ceres-...@googlegroups.com
On Thu, Sep 21, 2017 at 7:45 AM <phreak...@gmail.com> wrote:
Hi,
I'm trying to consider this option and I understand your idea would be to reproduce the functionality of the AutoDiffCostFunction but with an extra call to first compute the information matrix based on the current value of my parameters.
I don't really understand how should I implement this since it would seem that jacobians can be either expected or not at a given time and this is what triggers either the standard evaluate() call to the cost function functor, or to the auto differentiation
machinery. So in the case where Jacobians would be expected, how should I deal with this?

Implement a CostFunction object which calls an AutoDiffCostFunction object instead with your own storage to get the jacobians (Regardless whether ceres asks you to compute the jacobians or not) and then use these jacobians to compute the information matrix projection.

Sameer
 
 
In any case, when jacobians are expected I (think I) understand from the Differentiate() function that the Jet variables are first built, then used to invoke the cost functor and from that the real valued part is used to update the residual and the non-real valued part to obtain the jacobians. So, sorry for insisting in my idea of taking the real part of the parameters when I receive a Jet in my function, but wouldn't it what it is actually happening here? In case I wasn't clear before, I'm not talking about modifying the Jet or accessing the jacobians, but to used the real-valued part of the Jet to compute my information matrix, as if I were receiving a double value directly and do everything else the same. I have this implemented and would seem to work, but it is difficult to be sure about that.


On Wednesday, September 20, 2017 at 4:32:10 PM UTC-3, Sameer Agarwal wrote:
You can't access the jacobian while doing automatic differentiation.
What I would recommend doing in this case is creating a CostFunction yourself, which uses the underlying autodiff machinery to compute the Jacobian and uses it.
Sameer

--
You received this message because you are subscribed to the Google Groups "Ceres Solver" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ceres-solver...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages