测试一
代码
Eigen::MatrixXf src(3, 8);
Eigen::Vector3f t(1, 2, 3);
src << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0;
std::cout << "src:\n" << src << std::endl;
auto dst = src.topRows(3) + t;
std::cout << "src+:" << dst.rows() << " " << dst.cols() << std::endl << dst << std::endl;
src.topRows(3) += t;
std::cout << "src+=:\n" << src << std::endl;
Eigen::Map<Eigen::Matrix<float, 3, Eigen::Dynamic>, Eigen::Aligned> src_map(
src.data(), src.rows(), src.cols());
std::cout << "src_map:\n" << src_map << std::endl;
auto dst_map = src_map.topRows(3) + t;
std::cout << "src_map+:" << dst_map.rows() << " " << dst_map.cols() << std::endl
<< dst_map << std::endl;
src_map.topRows(3) += t;
std::cout << "src_map+=:\n" << src_map << std::endl;
std::cout << "Eigen version: " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "."
<< EIGEN_MINOR_VERSION << std::endl;
输出
MatrixXf.topRows(3)+Vector3f
的结果是MatrixXf
的第一列前三个值加上 Vector3f
。
MatrixXf.topRows(3)+=Vector3f
的结果是MatrixXf
逐列前三个值加上Vector3f
。
使用Eigen::Map
包装MatrixXf
不影响上述结果。
测试二
代码
Eigen::MatrixXf src(3, 8);
Eigen::Vector3f t(1, 2, 3);
src << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
std::cout << "src:\n" << src << std::endl;
auto dst = src + t;
std::cout << "src+:" << dst.rows() << " " << dst.cols() << std::endl << dst << std::endl;
src += t;
std::cout << "src+=:\n" << src << std::endl;
Eigen::Map<Eigen::Matrix<float, 3, Eigen::Dynamic>, Eigen::Aligned> src_map(
src.data(), src.rows(), src.cols());
std::cout << "src_map:\n" << src_map << std::endl;
auto dst_map = src_map + t;
std::cout << "src_map+:" << dst_map.rows() << " " << dst_map.cols() << std::endl
<< dst_map << std::endl;
src_map += t;
std::cout << "src_map+=:\n" << src_map << std::endl;
std::cout << "Eigen version: " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "."
<< EIGEN_MINOR_VERSION << std::endl;
输出
MatrixXf+Vector3f
的结果是MatrixXf
的第一列前三个值加上 Vector3f
。
MatrixXf+=Vector3f
的结果是MatrixXf
的第一列前三个值加上Vector3f
,后续列均为乱码。
使用Eigen::Map
包装MatrixXf
不影响上述结果。
疑问
把上面这两端测试代码夹在一个大工程中间,输出如上述记录。但如果把测试代码拿出来单独写一个cpp编译运行,就直接输出了断言错误:
/usr/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h:116: Eigen::CwiseBinaryOp<BinaryOp, Lhs, Rhs>::CwiseBinaryOp(const Lhs&, const Rhs&, const BinaryOp&) [with BinaryOp = Eigen::internal::scalar_sum_op<float, float>; LhsType = const Eigen::Block<Eigen::Matrix<float, -1, -1>, -1, -1, false>; RhsType = const Eigen::Matrix<float, 3, 1>; Lhs = Eigen::Block<Eigen::Matrix<float, -1, -1>, -1, -1, false>; Rhs = Eigen::Matrix<float, 3, 1>]: Assertion `aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols()’ failed.
搞不懂为什么。