24#include "boost/format.hpp"
25#include "ndarray/eigen.h"
41 ndarray::Array<double const, 2>
const& to,
42 ndarray::Array<double const, 1>
const& weights) {
43 if (from.getSize<0>() != to.getSize<0>()) {
45 (boost::format(
"'from' array first dimension (%d) does not match 'to' array first "
47 from.getSize<0>() % to.getSize<0>())
50 if (from.getSize<1>() != 3) {
53 (boost::format(
"'from' array second dimension size must be 3; got %d.") % from.getSize<1>())
56 if (to.getSize<1>() != 3) {
59 (boost::format(
"'to' array second dimension size must be 3; got %d.") % to.getSize<1>())
62 Eigen::Matrix<double, Eigen::Dynamic, 3> y = ndarray::asEigenMatrix(to);
63 Eigen::Matrix<double, Eigen::Dynamic, 3> x = ndarray::asEigenMatrix(from);
64 if (!weights.isEmpty()) {
65 auto w = ndarray::asEigenMatrix(weights);
66 y.array().colwise() *= w.array();
68 Eigen::JacobiSVD<Eigen::Matrix3d> svd(x.transpose() * y, Eigen::ComputeFullU | Eigen::ComputeFullV);
69 Eigen::Matrix3d u_t = svd.matrixU().transpose();
70 Matrix result = svd.matrixV() * u_t;
71 if (result.determinant() < 0) {
76 result = svd.matrixV() * u_t;
86 return SpherePoint(this->
operator()(point.getVector()));
90 Eigen::Vector3d v = _matrix *
asEigen(vector);
95 return _matrix.row(0).dot(Eigen::Vector3d(x, y, z));
98 return _matrix.row(1).dot(Eigen::Vector3d(x, y, z));
101 return _matrix.row(2).dot(Eigen::Vector3d(x, y, z));
#define LSST_EXCEPT(type,...)
Point in an unspecified spherical coordinate system.
Eigen::Vector3d asEigen(sphgeom::Vector3d const &vector) noexcept