当不需要编写模板函数时,Eigen引入了Ref <>类来编写具有Eigen对象作为参数的函数,而不使用不必要的临时对象.人们可以在这里读到这一点.
当进一步搜索互联网时,我使用Ref <>类找到了几个不同的参数声明.在Eigen文档中,它们const Eigen::Ref<const Eigen::MatrixXf>&用于第一个示例中的只读参数.在第二个例子Eigen::Ref<Eigen::MatrixXd>中引入了读写参数,这里BUT const Eigen::Ref<const Eigen::MatrixXd>用于只读参数(无引用).所以我的问题是:
以下声明和我何时使用它有什么区别?`
const Eigen::Ref<const Eigen::MatrixXd>&const Eigen::Ref<const Eigen::MatrixXd>const Eigen::Ref<Eigen::MatrixXd>&const Eigen::Ref<Eigen::MatrixXd>Eigen::Ref<const Eigen::MatrixXd>&Eigen::Ref<const Eigen::MatrixXd>Eigen::Ref<Eigen::MatrixXd>&Eigen::Ref<Eigen::MatrixXd>为了完整性,我列出了const使用和参考的每种可能组合.
在我的项目中,我将使用过的点类型更改Eigen::Vector2f为Eigen::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容器的小节.似乎我有两个选择:
Eigen::aligned_allocatorEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION宏.两次尝试都不编译(使用GCC 4.8.3和Clang 3.5进行测试),因为编译器无法正确转换初始化列表.
这里改变了代码:
#include <vector> …Run Code Online (Sandbox Code Playgroud) 我正在尝试遍历Eigen::MatrixXd matrix. 但是,似乎没有返回列大小和行大小的函数。有没有人知道如何做到这一点?
以下代码在 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) 我正在使用可从http://eigen.tuxfamily.org/下载的Eigen C++库.这是一个C++库,可以更轻松地处理矩阵和数组.我使用g ++编译器和gdb进行调试.但是,我发现在使用gdb时我无法打印Matrix的内容(由Eigen提供).
简而言之,问题是如何通过
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) 如何使用 Eigen3 执行逐元素乘法?
做
a = a.cwiseProduct(b);
Run Code Online (Sandbox Code Playgroud)
运行到位?或者是
a.array() *= b.array();
Run Code Online (Sandbox Code Playgroud)
在风格和性能方面更好的解决方案?
假设我有
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) 我有点绝望:对于我的学习,我需要与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 CMake
或
CMake找不到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)
有谁知道出了什么问题?
亲切的问候,朱利安
MSVC 19.31.31106.2在使用(和 C++17,据我了解特征页,对齐应该不再是问题)在发布模式下编译时,我遇到了以下问题,我segfault从std::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)