标签: eigen3

如何在 Eigen3 中调整向量大小

我将两个 Eigen3 向量包装在模板LineSegment<T,dim>类中。你可以这样使用它:

typedef LineSegment<double,2> LineSegment2d;
typedef LineSegment<double,3> LineSegment3d;
typedef LineSegment<int,3> LineSegment3i;
Run Code Online (Sandbox Code Playgroud)

它包含一个用于更改组件尺寸的模板化方法。这是修剪后的定义:

template<typename T,int dim>
struct LineSegment
{
public:
  template<int newDim>
  LineSegment<T,newDim> to() const
  {
    Eigen::Matrix<T,newDim,1> newp1;
    Eigen::Matrix<T,newDim,1> newp2;

    // TODO initialise newp1 and newp2 from d_p1 and d_p2

    return LineSegment<T,newDim>(newp1, newp2);
  }

  // ... other members ...

protected:
  Eigen::Matrix<T,dim,1> d_p1;
  Eigen::Matrix<T,dim,1> d_p2;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如何组成返回值,如上所示?这应该支持增加和减少维度。

我尝试使用 Eigen3 resize(int)方法,但在没有看到有关混合矩阵大小的警告的情况下无法使其工作。

最终,这应该有效:

LineSegment2d ls2d;
LineSegment3d ls3d = ls2d.to<3>(); // increase dim
ls2d = ls3d.to<2>();               // decrease dim
Run Code Online (Sandbox Code Playgroud)

我对 C++ …

c++ eigen eigen3

6
推荐指数
1
解决办法
8028
查看次数

特征值中最大系数的索引(按列)

在 Eigen 中,我可以进行行方向或列方向的“部分缩减”以获得最大系数。

例如这个程序:

#include <iostream>
#include <Eigen/Dense>

int main()
{
  Eigen::MatrixXf mat(2,4);
  mat << 1, 2, 6, 9,
         3, 1, 7, 2;

  std::cout << "Column's maximum: " << std::endl
   << mat.colwise().maxCoeff() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Column's maximum:
3 2 7 9
Run Code Online (Sandbox Code Playgroud)

我不想创建每列中具有最大系数的行向量,而是想构造一个具有每列最大系数的索引的行向量。

换句话说,我想修改程序,使输出变成:

Column's maximum:
1, 0, 1, 0
Run Code Online (Sandbox Code Playgroud)

我知道我可以一次获取一列索引,执行如下操作:

Eigen::MatrixXf::Index max_index;
mat.col(i).maxCoeff(&max_index);
Run Code Online (Sandbox Code Playgroud)

但我希望有一种更好的方法可以一步完成这一切,而不是手动循环每一列。这可能吗?(我使用的是 Eigen v3.2.7)

c++ eigen eigen3

6
推荐指数
1
解决办法
9367
查看次数

在模板化函数中使用 Ref&lt;&gt; 表示通用特征矩阵

这是我想写的一个函数:

template<typename NumType> using Vec = Eigen::Matrix<NumType, Eigen::Dynamic, 1>;


template<typename T>
void foo(Eigen::Ref<Vec<T>> p)
{
  // fill p with things
}

void main()
{
  Vec<double> v(2);
  foo(v)
}
Run Code Online (Sandbox Code Playgroud)

特别是,我希望能够foo在不向模板传递类型参数的情况下进行调用,而是让函数通过参数推断类型。当我运行此代码时,我收到错误

No matching function call to 'foo'
Candidate template ignored: could not match 'Ref' against 'Matrix'
Run Code Online (Sandbox Code Playgroud)

如果我将类型传递给函数调用,例如foo<double>(v). T我也知道如果 的签名是 则可以推断foo出类型

template<typename T>
void foo(Vec<T> & p)
Run Code Online (Sandbox Code Playgroud)

但这不是通过引用传递特征向量的好方法,因为它破坏了表达式模板的优点。

我也无法使用MatrixBase引用传递的方法

template<typename Derived>
void foo(Eigen::MatrixBase<Derived>& p)
Run Code Online (Sandbox Code Playgroud)

因为我想确保传入的向量的类型为T,并且我不知道如何使用此方法来确保这一点。

有没有一种方法可以Ref<>在这样的模板化函数中使用它来推断类型T?感谢所有帮助。

c++ templates eigen eigen3

6
推荐指数
1
解决办法
997
查看次数

使用 Eigen::VectorXd 减少 OpenMP

我正在尝试使用 OpenMP 缩减来并行化以下循环;

#define EIGEN_DONT_PARALLELIZE
#include <iostream>
#include <cmath>
#include <string>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Eigenvalues>
#include <omp.h>

using namespace Eigen;
using namespace std;

VectorXd integrand(double E)
{
    VectorXd answer(500000);
    double f = 5.*E + 32.*E*E*E*E;
    for (int j = 0; j !=50; j++)
        answer[j] =j*f;
    return answer;
}

int main()
{
    omp_set_num_threads(4);
    double start = 0.;
    double end = 1.;
    int n = 100;
    double h = (end - start)/(2.*n);

    VectorXd result(500000);
    result.fill(0.);
    double E = start;
    result = integrand(E); …
Run Code Online (Sandbox Code Playgroud)

c++ openmp eigen clang++ eigen3

6
推荐指数
1
解决办法
2623
查看次数

使用 TensorFlow 时“不支持/Eigen/CXX11/Tensor:没有这样的文件或目录”

我正在尝试在我的 C++ 应用程序中使用 tensorflow 作为外部库(主要遵循本教程)。到目前为止我做了什么:

  1. 我已经克隆了 tensorflow 存储库(假设 repo 根目录是$TENSORFLOW
  2. 运行/.configure(所有设置默认,所以没有 CUDA,没有 OpenCL 等)。
  3. 使用bazel build -c /opt //tensorflow:libtensorflow_cc.so(构建成功完成)构建共享库
  4. 现在我正在尝试#include "tensorflow/core/public/session.h"。但是在包含它(并添加$TENSORFLOW$TENSORFLOW/bazel-genfiles包含路径)之后,我收到错误:

    $TENSORFLOW/tensorflow/third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:42:
    fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory
    
    Run Code Online (Sandbox Code Playgroud)

有一个为类似问题创建的github问题,但它被标记为已关闭而没有提供任何解决方案。我也尝试过master分支和v.1.4.0发布。

您是否知道,可能导致此类问题的原因以及如何处理?

c++ eigen3 tensorflow ubuntu-16.04

6
推荐指数
1
解决办法
5495
查看次数

特征库中列式初始化和标准差的计算

我做了一个 MATLAB 代码,我正在尝试使用 Eigen 库在 C++ 中完成它。在我的 MATLAB 代码中,我必须执行这样的特定功能

M=10;
s1 = zeros(20,M);
for i=1:M
  s1(:,i) = i*i;%some function 
  s1(:,i) = s1(:,i)/std(s1(:,i));
end
Run Code Online (Sandbox Code Playgroud)

我对使用 .colwise() 感到困惑,是否有内置函数可以使用 Eigen 库获取标准偏差?

c++ matlab eigen3

6
推荐指数
1
解决办法
3911
查看次数

CMake find_package 不适用于 Eigen?

我目前正在使用 Eigen 开发卡尔曼滤波库,并且我已经成功地让它在我的开发 Mac 上工作。现在我正在尝试使用 Travis CI 进行设置,而 CMake 在查找包时遇到了麻烦。首先,我sudo apt install libeigen3-dev然后尝试使用以下配置运行 cmake:

cmake_minimum_required(VERSION 3.0)
project(KFilter VERSION 0.1.0)

find_package (Eigen3 REQUIRED NO_MODULE)
add_library(KFilter KFilter.cpp)
target_link_libraries(KFilter Eigen3::Eigen)
Run Code Online (Sandbox Code Playgroud)

这在我的 Mac 上构建得很好,但在 Travis CI 中,它出现以下错误:

CMake Error at CMakeLists.txt:5 (add_library):
  Target "KFilter" links to target "Eigen3::Eigen" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?
Run Code Online (Sandbox Code Playgroud)

当 find_package 似乎成功时,为什么我会在第 5 行收到此错误?我正在遵循Eigen 网站上的指南。

Travis CI 正在运行带有 CMake …

cmake eigen travis-ci eigen3

6
推荐指数
1
解决办法
4309
查看次数

如何修复 eigen3 中的“非类型模板参数不是常量表达式”?

我还是 Eigen 库和 C++ 的新手。我正在测试一些代码,但我不明白为什么会这样

#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main()
{
  int a = 2;
  const int SIZE_ = a;
  Eigen::Matrix<float, SIZE_, SIZE_> test;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

不编译,而这

#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main()
{
  const int SIZE_ = 2;
  Eigen::Matrix<float, SIZE_, SIZE_> test;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

工作得很好。我如何更改第一个代码以使其工作(即 SIZE_ 将由一个可能具有不同值的变量启动)。

c++ c++11 eigen3

6
推荐指数
1
解决办法
2301
查看次数

不同初始化时的不同行为

当尝试使用 Eigen 中某些操作的结果来初始化 Vector 时,结果似乎根据所使用的语法而有所不同,即,在我的机器上,以下代码末尾的断言失败:

const unsigned int n = 25;
Eigen::MatrixXd R = Eigen::MatrixXd::Random(n,n);
Eigen::VectorXd b = Eigen::VectorXd::Random(n);

Eigen::VectorXd x = Eigen::VectorXd::Zero(n);
Eigen::VectorXd y = Eigen::VectorXd::Zero(n);

y = R.triangularView<Eigen::Upper>().solve(b);
x << R.triangularView<Eigen::Upper>().solve(b);

assert((x-y).norm() < std::numeric_limits<double>::epsilon()*10E6);
Run Code Online (Sandbox Code Playgroud)

我知道潜在的舍入误差,但根据我的理解, 的两个评估 R.triangularView<Eigen::Upper>().solve(b)应该具有完全相同的精度误差,因此结果相同。这种情况也仅在使用 初始化一个变量<<并使用 初始化另一个变量时发生operator=,但如果两个变量都以相同的方式分配,则不会发生这种情况。

当不仅仅对上三角部分使用向后替换而是对R.lu().solve(b)两者进行评估并比较结果时,差异要小得多,但仍然存在。如果以几乎相同的确定性方式分配两个向量,为什么会不同?

我在具有 x86-64 架构的 Arch Linux 和 Debian 上尝试了这段代码,使用 Eigen 版本 3.4.0,使用 C++11、C++17、C++20,使用 clang 和 gcc 编译。

c++ eigen eigen3

6
推荐指数
1
解决办法
335
查看次数

eigen3 与 libfmt &gt;= 9.0

我曾经能够将 Eigen3 数组/矩阵传递给 spdlog,它内部使用 libfmt。从 libfmt 9.0.0 开始,这些类型不再由 libfmt 格式化,无需进一步的代码。

\n

fmt 通过专门化类型来支持自定义fmt::formatter<T>类型;fmt9 文档进一步解释说,派生此专业化ostream_formatter将利用现有的operator<<,Eigen 类可以方便地提供这些。

\n

Eigen使用 CRTP 继承,我将专门研究Eigen::DenseBase<T>这样的所有类型:

\n
#include<fmt/ostream.h>\n#include<eigen3/Eigen/Core>\n#include<iostream>\n\ntemplate <typename T> struct fmt::formatter<T,std::enable_if_t<std::is_base_of_v<Eigen::DenseBase<T>,T>>>: ostream_formatter {};\n\nint main(){\n    Eigen::Array3f a(1,2,3);\n    std::cout<<fmt::format("{}",a)<<std::endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

自从我发帖以来,很明显这并不顺利:

\n
In file included from /usr/include/fmt/format.h:48,\n                 from /usr/include/fmt/ostream.h:18,\n                 from /tmp/aa.cpp:1:\n/usr/include/fmt/core.h: In instantiation of \xe2\x80\x98constexpr fmt::v9::detail::value<Context> fmt::v9::detail::make_value(T&&) [with Context = fmt::v9::basic_format_context<fmt::v9::appender, char>; T = Eigen::Array<float, 3, 1>&]\xe2\x80\x99:\n/usr/include/fmt/core.h:1771:29:   required from \xe2\x80\x98constexpr fmt::v9::detail::value<Context> fmt::v9::detail::make_arg(T&&) [with bool IS_PACKED = …
Run Code Online (Sandbox Code Playgroud)

eigen eigen3 fmt

6
推荐指数
2
解决办法
1191
查看次数

标签 统计

eigen3 ×10

c++ ×8

eigen ×7

c++11 ×1

clang++ ×1

cmake ×1

fmt ×1

matlab ×1

openmp ×1

templates ×1

tensorflow ×1

travis-ci ×1

ubuntu-16.04 ×1