标签: eigen3

正确使用Eigen :: Ref <>类

当不需要编写模板函数时,Eigen引入了Ref <>类来编写具有Eigen对象作为参数的函数,而不使用不必要的临时对象.人们可以在这里读到这一点.

当进一步搜索互联网时,我使用Ref <>类找到了几个不同的参数声明.在Eigen文档中,它们const Eigen::Ref<const Eigen::MatrixXf>&用于第一个示例中的只读参数.在第二个例子Eigen::Ref<Eigen::MatrixXd>中引入了读写参数,这里BUT const Eigen::Ref<const Eigen::MatrixXd>用于只读参数(无引用).所以我的问题是:

以下声明和我何时使用它有什么区别?`

  1. const Eigen::Ref<const Eigen::MatrixXd>&
  2. const Eigen::Ref<const Eigen::MatrixXd>
  3. const Eigen::Ref<Eigen::MatrixXd>&
  4. const Eigen::Ref<Eigen::MatrixXd>
  5. Eigen::Ref<const Eigen::MatrixXd>&
  6. Eigen::Ref<const Eigen::MatrixXd>
  7. Eigen::Ref<Eigen::MatrixXd>&
  8. Eigen::Ref<Eigen::MatrixXd>

为了完整性,我列出了const使用和参考的每种可能组合.

c++ parameters pass-by-reference eigen eigen3

21
推荐指数
1
解决办法
4478
查看次数

更改std :: vector的分配器时,为什么初始化程序列表不可用?

在我的项目中,我将使用过的点类型更改Eigen::Vector2fEigen::Vector2d并遇到了对齐问题.

这是代码的简化版本:

#include <vector>
#include <Eigen/Eigen>

int main()
{
    std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} };
}
Run Code Online (Sandbox Code Playgroud)

我收到以下运行时错误:

eigen3/Eigen/src/Core/DenseStorage.h:78: Eigen::internal::plain_array<double, 2, 0, 16>::plain_array() [T = double, Size = 2, MatrixOrArrayOptions = 0, Alignment = 16]: Assertion `(reinterpret_cast<size_t>(array) & 0xf) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed.
Run Code Online (Sandbox Code Playgroud)

正如断言消息所示,我读到了固定大小的可矢量化特征对象所需的对齐.还有关于STL容器的小节.似乎我有两个选择:

  1. 使用 Eigen::aligned_allocator
  2. 或使用EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION宏.

两次尝试都不编译(使用GCC 4.8.3和Clang 3.5进行测试),因为编译器无法正确转换初始化列表.

这里改变了代码:

#include <vector> …
Run Code Online (Sandbox Code Playgroud)

c++ memory-alignment initializer-list c++11 eigen3

15
推荐指数
1
解决办法
1151
查看次数

如何获取 Eigen::MatrixXd 的行数和列数?

我正在尝试遍历Eigen::MatrixXd matrix. 但是,似乎没有返回列大小和行大小的函数。有没有人知道如何做到这一点?

c++ eigen3

15
推荐指数
1
解决办法
1万
查看次数

使用非布尔返回值重载相等比较时,C++20 中的重大变化或 clang-trunk/gcc-trunk 中的回归?

以下代码在 c++17 模式下使用 clang-trunk 编译得很好,但在 c++2a(即将推出的 c++20)模式下会中断:

// Meta struct describing the result of a comparison
struct Meta {};

struct Foo {
    Meta operator==(const Foo&) {return Meta{};}
    Meta operator!=(const Foo&) {return Meta{};}
};

int main()
{
    Meta res = (Foo{} != Foo{});
}
Run Code Online (Sandbox Code Playgroud)

使用 gcc-trunk 或 clang-9.0.0 也可以很好地编译:https : //godbolt.org/z/8GGT78

clang-trunk 的错误和-std=c++2a

<source>:12:19: error: use of overloaded operator '!=' is ambiguous (with operand types 'Foo' and 'Foo')
    Meta res = (f != g);
                ~ ^  ~
<source>:6:10: …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer eigen eigen3 c++20

14
推荐指数
3
解决办法
1057
查看次数

使用GDB和Eigen C++库

我正在使用可从http://eigen.tuxfamily.org/下载的Eigen C++库.这是一个C++库,可以更轻松地处理矩阵和数组.我使用g ++编译器和gdb进行调试.但是,我发现在使用gdb时我无法打印Matrix的内容(由Eigen提供).

c++ debugging gdb eigen eigen3

11
推荐指数
2
解决办法
4746
查看次数

使用 Eigen::Map&lt;Eigen::MatrixXd&gt; 作为 Eigen::MatrixXd 类型的函数参数

简而言之,问题是如何通过

Eigen::Map<Eigen::MatrixXd>
Run Code Online (Sandbox Code Playgroud)

一个函数的对象,它期望一个

Eigen::MatrixXd
Run Code Online (Sandbox Code Playgroud)

目的。


更长的故事:

我有这个 C++ 函数声明

void npMatrix(const Eigen::MatrixXd &data, Eigen::MatrixXd &result);
Run Code Online (Sandbox Code Playgroud)

连同这个实现

void npMatrix(const Eigen::MatrixXd &data, Eigen::MatrixXd &result)
{
//Just do s.th. with arguments
std::cout << data << std::endl;

result(1,1) = -5;
std::cout << result << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我想使用 numpy.array 作为参数从 python 调用这个函数。为此,我使用了一个用 c++ 编写的包装函数

void pyMatrix(const double* p_data, const int dimData[],
                              double* p_result, const int dimResult[]);
Run Code Online (Sandbox Code Playgroud)

它需要一个指向数据的指针、数据数组的大小、一个指向结果的指针以及结果数组的大小。数据指针指向内存的常量补丁,因为当为结果保留的内存补丁可写时,数据不会被更改。函数的实现

void pyMatrix(const double *p_data, const int dimData[], double *p_result, const int dimResult[])
{
Eigen::Map<const Eigen::MatrixXd> dataMap(p_data, dimData[0], dimData[1]); …
Run Code Online (Sandbox Code Playgroud)

c++ numpy eigen3

10
推荐指数
1
解决办法
8369
查看次数

Eigen3:就地系数乘法

如何使用 Eigen3 执行逐元素乘法?

a = a.cwiseProduct(b);
Run Code Online (Sandbox Code Playgroud)

运行到位?或者是

a.array() *= b.array();
Run Code Online (Sandbox Code Playgroud)

在风格和性能方面更好的解决方案?

optimization eigen eigen3

9
推荐指数
1
解决办法
7553
查看次数

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

假设我有

Eigen::VectorXd x; //{1,2,3,4,5,6,7,8}
Run Code Online (Sandbox Code Playgroud)

Eigen::VectorXd ind_vec; //{0,2,4,5}
Run Code Online (Sandbox Code Playgroud)

有没有办法轻松提取ind_vecx 的元素?

就像是:

x.extract(ind_vec) returning {1, 3, 5, 6}
Run Code Online (Sandbox Code Playgroud)

c++ eigen eigen3

9
推荐指数
4
解决办法
7510
查看次数

无法通过CMake找到Eigen3

我有点绝望:对于我的学习,我需要与Eigen和CMake合作.我能够使用Eigen,如果我将整个库复制到我的编译器默认查找的目录中,但是一旦我尝试通过它找到它
find_package(Eigen3 REQUIRED)
我得到以下错误:


CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find Eigen3 (missing: EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
  (Required is at least version "2.91.0")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  FindEigen3.cmake:76 (find_package_handle_standard_args)
  CMakeLists.txt:8 (find_package)

-- Configuring incomplete, errors occurred!

Run Code Online (Sandbox Code Playgroud)

现在我搜索了解决方案,但我尝试过的所有(也是stackoverflow上的那些:
查找包Eigen3 for CMakeCMake找不到Eigen3)都不起作用.我的Eigen版本(根据Macros Core/util/Macros.h)是3.2.5.我保留了Eigen目录/usr/local/include,我使用FindEigen3.cmake了Eigen库附带的内容,我的CMakeLists.txt外观如下:


cmake_minimum_required(VERSION 2.8)
project(Test)

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
message("Found Eigen3 in: ${EIGEN3_INCLUDE_DIR}")

add_executable(main test.cpp)
Run Code Online (Sandbox Code Playgroud)

有谁知道出了什么问题?

亲切的问候,朱利安

c++ cmake eigen3

9
推荐指数
1
解决办法
1万
查看次数

std::sort 与包含 Eigen 数据类型的结构会导致段错误

MSVC 19.31.31106.2在使用(和 C++17,据我了解特征页,对齐应该不再是问题)在发布模式下编译时,我遇到了以下问题,我segfaultstd::sort. 使用的是官方发布的Eigen 3.4版本。

设置了以下编译器标志:

/errorReport:prompt /WX /Zc:forScope /GR /arch:AVX2 /Gd /MD /std:c++17 /GS /W4 /wd"4389" /wd"4996" /wd"4244" /wd"4324" /wd"4127" /Zc:wchar_t  /EHsc /nologo /Gm- /O2 /Ob2 /Zc:inline /fp:precise /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS"  
Run Code Online (Sandbox Code Playgroud)

所以我有以下结构:

/errorReport:prompt /WX /Zc:forScope /GR /arch:AVX2 /Gd /MD /std:c++17 /GS /W4 /wd"4389" /wd"4996" /wd"4244" /wd"4324" /wd"4127" /Zc:wchar_t  /EHsc /nologo /Gm- /O2 /Ob2 /Zc:inline /fp:precise /D "_MBCS" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" …
Run Code Online (Sandbox Code Playgroud)

c++ eigen eigen3

9
推荐指数
0
解决办法
276
查看次数