问题标签 [eigen3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
501 浏览

c++ - 为什么在 ColMajor MappedSparseMatrix 上调用 .row() 方法失败?

这是我的代码:

这是我尝试时收到的错误消息std::cout << u2i.row(1) << std::endl;

my_exec: /usr/include/Eigen/src/Core/util/XprHelper.h:53: Eigen::internal::variable_if_dynamic::variable_if_dynamic(T) [with T = int; int Value = 1]:断言 `v == T(Value)' 失败。中止(核心转储)

似乎问题在于.row()ColMajor 矩阵;但是,我不明白为什么这会导致错误,或者为什么.row()根本允许使用方法?

如果我在我的实现中没有遗漏任何东西,这里发生了什么?

我正在使用本征 3.2.2。

编辑:

显然这也失败了SparseMatrix

错误信息(相同):

test_calc_top_actions.exe: /usr/include/eigen3/Eigen/src/Core/util/XprHelper.h:53: Eigen::internal::variable_if_dynamic::variable_if_dynamic(T) [with T = int; int Value = 1]:断言 `v == T(Value)' 失败。中止

0 投票
1 回答
72 浏览

c++ - 用模板替换标量失败

我正在尝试编写一个从 double 或 float 类型获取 Eigen::Matrix 的函数。此函数适用于浮点数:

但是,一旦我将“浮动”作为模板:

我在 linux 上使用 gcc 4.9.1 得到这个错误:

.../utils.hpp:在函数'Eigen::Matrix core::math::foo(const Eigen::Matrix&)'中:.../utils.hpp:77:47:错误:请求成员'转置' in '(0, 0)',属于非类类型 'int' result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose( );

这里可能是什么问题?

0 投票
1 回答
72 浏览

c++ - 对角线 MatrixXd 与 VectorXd 的串联重复

我需要使用 Eigen 库在 C++ 中创建一个对角线 MatrixXd,其中对角线上的元素是较短 VectorXd 的 N 次复制。

矢量Xd R; // 大小为 n 的向量

矢量Xd V; // 一个大小为 n*N 的向量,对应于 R 的 N 个连接副本,我不知道如何创建

MatrixXd D=MatrixXd(V.asDiagonal()); //我的对角矩阵大小为 n N xn N

谢谢。

0 投票
1 回答
4354 浏览

c++ - Eigen::Vector3f 对齐

Eigen::Vector3f我正在使用 Eigen 处理非结构化点集(点云),表示为对象数组。为了启用 SIMD 矢量化,我Vector3f使用 alignas(16) 将其子类化为一个类。数组中的每个对象都以 16 字节的边界开始,彼此之间有 4 字节的间隙,并且包含未初始化的数据。

子类目前看起来像这样:(仍然需要添加模板复制构造函数和运算符=,如 Eigen 文档中所示)

汇编输出显示正在使用 SIMD 指令,并且point_xyz对数组中的每个应用进行转换的程序似乎工作正常。

以这种方式使用 Eigen 是否安全,或者结果是否取决于未使用的 4 字节间隙的内容等?

此外,将 RGB 颜色数据或其他数据放入未使用的 4 个字节是否安全(需要覆盖内存对齐)?

编辑:启用优化时,clang++ 和 g++ 似乎都做了一些矢量化。如果没有优化(以及低于 -O2 的 clang++),两者都会为以下矩阵乘法(转换)生成对 Eigen 库函数的调用:

(需要 for 循环和 cout 以便优化不会删除乘法或放入一个常数值)。

在 GCC (-O1) 中,它导致

无论有没有 ,它都会产生相同的输出#define EIGEN_DONT_VECTORIZE 1。使用Vector4f时,当 Eigen 的矢量化未禁用但两者都在 xmm 寄存器上运行时,会生成稍短的输出。

AlignedVector3<float>似乎不支持与 的乘法Eigen::Transform。我正在对使用 3 个(非同质)坐标表示的点集进行仿射变换。我不确定 Eigen 如何实现向量的Eigen::Transform<float, 3, Eigen::Affine>转换Eigen::Vector4f。即它是否只改变向量的前 3 个分量,第四个分量是否必须为零,或者它可以包含任意值,还是将 4 向量解释为齐次坐标?它是否取决于转换的内部表示 ( Affine, AffineCompact, Projective)。

0 投票
5 回答
14486 浏览

c++ - 如何从 Eigen 中的索引向量中提取子向量(Eigen::Vector)?

假设我有

有没有一种简单的方法来提取ind_vecx 的元素?

就像是:

0 投票
1 回答
587 浏览

c++ - C++ Eigen:如何编写一个既可以采用常规(密集)矩阵又可以采用对角矩阵的函数?

我有一个在内部执行一些线性代数的函数,但我希望能够将常规密集矩阵以及对角矩阵(后者用于提高效率)传递给它。我尝试了以下语法:

但这不会编译,因为 MatrixBase 没有 cols() 函数!

我知道 DiagonalMatrix 类有一个 toDenseMatrix() 函数,但我担心的是它涉及值的内部复制,因此会使我希望从 DiagonalMatrix 获得的所有优化无效。

我该怎么办?

0 投票
1 回答
14011 浏览

cmake - CMake 找不到源目录(安装 Eigen)

我正在 Ubuntu 上安装库Eigen。我按照说明在下载的源目录旁边创建了一个“构建目录”。也就是说,我有两个目录:eigen-eigen-1306d75b4a21源目录和eigen-build构建目录。

然后我做了:

之后立即发生错误make install并停止安装:

显然该目录存在。我的 CMake 有什么问题?(我对 CMake 了解不多。我在第二步中观察到了一些警告,说缺少 Qt4 之类的很多东西,但我认为这不是原因,因为错误消息暗示了什么。)

0 投票
2 回答
1329 浏览

c++ - 一般产品的本征自动类型扣除

我有以下代码(我为稍大的代码片段道歉,这是我能够减少问题的最小示例):

主要思想是模板函数Id<>()将 Eigen 表达式A 作为参数,连同 size D,并在表达式的标量字段上生成单位矩阵A。此功能本身可以正常工作。但是,当我在具有推导类型的 Eigen 乘积中使用它时auto,例如在 line auto autoresult = Id(Foo, 4) * v中,我希望将向量乘以v 单位矩阵,因此最终结果应该是一个表达式,在评估时应该完全等于v. 但事实并非如此,请参阅第一个for循环,每当我显示结果并计算其范数时,我大部分时间都是垃圾。另一方面,如果我隐式转换 Eigen 积Id(Foo, 4) * v对于动态矩阵,一切正常,结果得到正确评估。

我在 OS X Yosemite 上使用 Eigen 3.2.2,并在 g++4.9.1 和 Apple LLVM 6.0 版(clang-600.0.54)(基于 LLVM 3.5svn)中得到相同的奇怪行为

问题:

  • 我不明白第一个for循环中发生了什么,为什么在我使用时std::cout,甚至在我使用该norm方法时都没有评估产品?我错过了什么吗?这里没有涉及混叠,我真的对发生的事情感到困惑。我知道 Eigen 使用惰性求值,并在需要时对表达式求值,但这里似乎并非如此。这个问题对我来说非常重要,因为我有很多与 类似的函数,Id<>()auto 推导表达式中使用时可能会失败。

问题经常发生,但并非总是如此。但是,如果您将程序运行 3-4 次,您肯定会看到它。

我用来编译和运行它的命令是:

我在实际运行中得到的典型输出是:

即使我eval()使用

我得到了同样奇怪的行为。

0 投票
1 回答
217 浏览

c++ - 如何在已有的 3 标准压缩行/列数组上包装 Eigen::SparseMatrix

注意:我已经问过这个问题,但由于“太宽泛”而没有太多解释而被关闭。我看不出这个问题如何更具体(它针对特定用途处理特定库的特定类......),所以我认为这类似于“版主的错误”并再次询问。 ..

我想在稀疏矩阵上使用 Eigen 执行稀疏矩阵/矩阵乘法。这些矩阵已经在我正在处理的标准 3 数组压缩行/列存储中的代码中定义。

然后我想使用 Eigen::SparseMatrix 类作为这些数组的包装器(假设内部 Eigen 使用这样的 3 数组存储)以避免在内存中重复矩阵。我想做类似以下的事情:

有可能吗?如果可以,怎么做?

非常感谢

0 投票
0 回答
311 浏览

c++ - Eigen segfault 没有优化 Solaris

我有以下代码:

每当我在 Solaris 11(使用 g++4.9)下构建项目时,没有进行任何优化,运行时都会出现段错误(核心转储)。经过一番挖掘和逐步调试后,我认为故障线在 DenseCoeffBase.h,内部功能copyPacket,即线537

我用来编译/运行的命令行:g++ -std=c++11 -I ./eigen_3.2.2 example.cpp; ./a.out

一些备注:

  • 如果我将声明移到States st;里面main(),它可以工作,没有段错误。
  • 如果我取消注释vin的声明States并注释 C++11 样式的初始化,然后v.resize(2); v << 1, 1;在构造函数中使用,它可以工作
  • 如果我使用-O2-O3优化,它可以工作。
  • 在我测试过的所有其他平台(Ubuntu 14.04、Debian7、OS X 10.10)上,无论优化级别如何,它都能正常工作
  • 这个问题似乎只出现在 Solaris 上,没有优化,在 g++4.9 下

我的问题如下:

  1. 我写的代码正确吗?也就是说,我可以安全地使用C++11-style 类内初始化,还是应该只声明向量然后在构造函数中调整它的大小?

  2. 如果我的代码是正确的,有没有人遇到过这个问题?(我知道这极不可能,但我仍然问:))

PS:我使用 Eigen 3.2.2(虽然问题也出现在 3.2.1 上)

如果有人能告诉我是否可以在 Solaris11 上构建/运行程序,我将不胜感激(无论编译器如何)