Eigen 中的类跨度类型?

问题描述

如果我想使用 Eigen 创建一个接受矩阵作为参数的 C++ 函数,我可以执行以下操作:

void f(const Eigen::MatrixXf& mat) { /*...*/ }

但如果数据不在 Eigen::MatrixXf 中,那么我需要创建一个来保存它并复制其所有权下的(可能很大)数据。

Eigen 是否本着 std::string_viewstd::span 的精神提供了一个“非拥有”类矩阵的引用类型/模板,它将接受一个 Eigen::MatrixXf 对象作为参数,但会还接受以某种方式打包的“多维布局”原始(甚至任意跨步)浮点数组?

如果是,该类型称为什么以及如何使用?

也许 Eigen::Map ?但这似乎与其他人的工作方式不同?您可以将其用作函数参数吗?如何?或者是否有其他类型用于此目的?

解决方法

Eigen::Ref 是您所追求的。来自 Eigen 文档...

以特征类型为参数编写函数

Eigen 使用表达式模板可能导致每个表达式都属于不同类型。如果您将这样的表达式传递给采用 Matrix 类型参数的函数,您的表达式将被隐式计算为临时 Matrix,然后将其传递给该函数。这意味着您失去了表达式模板的好处.... [etc]

#include <iostream>
#include <Eigen/SVD>
using namespace Eigen;
using namespace std;

float inv_cond(const Ref<const MatrixXf>& a)
{
  const VectorXf sing_vals = a.jacobiSvd().singularValues();
  return sing_vals(sing_vals.size()-1) / sing_vals(0);
}

http://eigen.tuxfamily.org/dox-devel/TopicFunctionTakingEigenTypes.html