我将两个 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++ …
在 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)
这是我想写的一个函数:
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?感谢所有帮助。
我正在尝试使用 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++ 应用程序中使用 tensorflow 作为外部库(主要遵循本教程)。到目前为止我做了什么:
$TENSORFLOW)/.configure(所有设置默认,所以没有 CUDA,没有 OpenCL 等)。bazel build -c /opt //tensorflow:libtensorflow_cc.so(构建成功完成)构建共享库现在我正在尝试#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发布。
您是否知道,可能导致此类问题的原因以及如何处理?
我做了一个 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 库获取标准偏差?
我目前正在使用 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 …
我还是 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_ 将由一个可能具有不同值的变量启动)。
当尝试使用 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 编译。
我曾经能够将 Eigen3 数组/矩阵传递给 spdlog,它内部使用 libfmt。从 libfmt 9.0.0 开始,这些类型不再由 libfmt 格式化,无需进一步的代码。
\nfmt 通过专门化类型来支持自定义fmt::formatter<T>类型;fmt9 文档进一步解释说,派生此专业化ostream_formatter将利用现有的operator<<,Eigen 类可以方便地提供这些。
Eigen使用 CRTP 继承,我将专门研究Eigen::DenseBase<T>这样的所有类型:
#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}\nRun Code Online (Sandbox Code Playgroud)\n自从我发帖以来,很明显这并不顺利:
\nIn 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)