eigen3 相关问题

Eigen是线性代数的C ++模板库:矩阵,向量,数值求解器和相关算法。

无法访问https://eigen.tuxfamily.org/

我想安装 Eigen3,它是线性代数的 C++ 模板库。它应该可以在网站链接 https://eigen.tuxfamily.org/ 上找到,但奇怪的是,我无法打开它。是不是网络...

回答 1 投票 0

避免在特征值中使用对角矩阵进行分配

问题 如何避免特征中小对角矩阵的动态分配? 语境 我正在使用本征 3.4。我有一个 N × N 对角矩阵 W: 自动 W = 本征::对角矩阵 问题 如何避免 Eigen 中小对角矩阵的动态分配? 背景 我正在使用 Eigen 3.4。我有一个 N × N 对角矩阵 W: auto W = Eigen::DiagonalMatrix<double, Dynamic>(N); 如果 N <= 512 by using a buffer on the stack:我想避免分配 double W_buffer[512]; 对于法向量和矩阵,我知道我可以使用Map: double y_buff[512]; auto y = Eigen::Map<VectorXd>( y_buff, N ); 但是,当我对对角矩阵尝试相同的操作时,它会给我一个错误,因为 InnerStrideAtCompileTime 不是 Eigen::DiagonalMatrix 的成员。 将 Map 与 DiagonalMatrix 结合使用时出现错误消息 In file included from eigen/Eigen/Core:311, from eigen/Eigen/Dense:1, from build/release/CMakeFiles/bench.dir/cmake_pch.hxx:5, from <command-line>: eigen/Eigen/src/Core/Map.h: In instantiation of ‘struct Eigen::internal::traits<Eigen::Map<Eigen::DiagonalMatrix<double, -1> > >’: eigen/Eigen/src/Core/util/ForwardDeclarations.h:34:48: required from ‘struct Eigen::internal::accessors_level<Eigen::Map<Eigen::DiagonalMatrix<double, -1> > >’ eigen/Eigen/src/Core/util/ForwardDeclarations.h:101:75: required from ‘class Eigen::Map<Eigen::DiagonalMatrix<double, -1> >’ include/volar/estimators.hpp:203:18: required from ‘static volar::R volar::PolyLE<Degree>::estimate(volar::R, volar::ViewR, volar::ViewR, const Kernel&) [with Kernel = volar::UniformK; int Degree = 1; volar::R = double; volar::ViewR = volar::View<double>]’ include/volar/kernel_smoothing.hpp:81:64: required from ‘volar::R volar::LocalRFT<Estimator, Kernel>::operator()(volar::R) const [with Estimator = volar::EigenLinearLE; Kernel = volar::UniformK; volar::R = double]’ bench/core.cpp:43:23: required from ‘void localRF(benchmark::State&) [with Method = volar::EigenLinearLE; Kernel = volar::UniformK]’ bench/core.cpp:96:1: required from here eigen/Eigen/src/Core/Map.h:30:53: error: ‘InnerStrideAtCompileTime’ is not a member of ‘Eigen::DiagonalMatrix<double, -1>’ 30 | ? int(PlainObjectType::InnerStrideAtCompileTime) | ^~~~~~~~~~~~~~~~~~~~~~~~ In file included from eigen/Eigen/Core:163, from eigen/Eigen/Dense:1, from build/release/CMakeFiles/bench.dir/cmake_pch.hxx:5, from <command-line>: Eigen::DiagonalMatrix的第三个模板参数,MaxSizeAtCompileTime可以让你做到这一点。 与 Eigen::Dynamic 结合使用时,DiagonalMatrix 将具有足够大的内部缓冲区以容纳 MaxSizeAtCompileTime,但其大小仍会动态调整。 例如,以下内容相当于您尝试使用外部缓冲区执行的操作: auto W = Eigen::DiagonalMatrix<double, Eigen::Dynamic, 512>(N) 显然,尝试使用大于 MaxSizeAtCompileTime 的大小来初始化它会在运行时失败(使用断言),但这并不比使用 Map 时必须处理的情况更糟糕。 您可以按照您描述和使用 Map 方法的“正常”方式进行操作,而不是尝试 DiagonalMatrix asDiagonal()。 可能稍微不太干净,必须输入 y.asDiagonal() 而不是仅仅 y...也许你可以用 Eigen::Ref 做一些事情来保留对来自向量的对角矩阵的引用,但我不确定是否那会起作用的。 asDiagonal(): https://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#a14235b62c90f93fe910070b4743782d0

回答 2 投票 0

为什么 Eigen 默认使用 Column-Major 而不是 Row-Major?

虽然Eigen是C++库并且C/C++使用行优先存储结构,但为什么Eigen更喜欢使用列优先存储顺序?来自 为什么 MATLAB 使用列优先顺序?帖子,我明白了,MA...

回答 3 投票 0

在暗淡的 1 上堆叠本征中具有不同形状的张量

我有一系列形状为 [B, n, C] 的张量,其中 B 和 C 具有恒定大小,n 在张量之间变化(例如,[1, 5] 中的 n)。我想将所有这些张量连接成一个......

回答 2 投票 0

从齐次变换矩阵得到旋转和平移矩阵

我有以下代码: Eigen::Matrix4f 变换 = myMethod(); // 齐次变换矩阵 std::cout << "transformation = " << std::endl <<

回答 1 投票 0

将特征矩阵存储在二进制文件中的通用函数

我知道下面的代码可以用来将数据类型为double的特征矩阵的数据写入二进制文件。 模板 void WriteEigenMatrix(const Eigen::Matrix 我知道以下代码可用于将数据类型为 double 的特征矩阵的数据写入二进制文件。 template<class T> void WriteEigenMatrix(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>& m, const char* fileName) { std::ofstream outFile(fileName, std::ios_base::out | std::ios_base::binary); outFile.write(m.data(), m.rows()*m.cols()); outFile.close();` } 如何概括此函数以接受其他特征数据类型(如 Eigen::Vector 和 Eigen::Array)作为输入? 如果我使用 Eigen::EigenBase,我知道该函数将接受所有此类数据类型。然而,问题是我不能再使用m.data(),因为它没有在基类中定义。 有什么建议可以解决这个问题吗? 如果您只想允许“密集”对象,您可以按如下方式操作: template<class Derived> void WriteEigen(const Eigen::DenseBase<Derived>& dense, const char* fileName) { std::ofstream outFile(fileName, std::ios_base::out | std::ios_base::binary); outFile.write(reinterpret_cast<const char*>(dense.derived().data()), dense.rows() * dense.cols()); outFile.close(); } 所有稠密矩阵(包括向量和数组)都继承自DenseBase,在derived上调用DenseBase将返回具体的矩阵类型。 或使用您喜欢的任何底座。

回答 1 投票 0

Eigen3 张量切片,无需复制数据

我一直在为一个新项目测试 Eigen3 的 Tensor 模块。 即使该模块尚未完成,它似乎也具有我需要的大部分功能。 但有一个部分我...

回答 2 投票 0

C++ 特征库:编写应用系数数学运算并适用于 ArrayBase 和 MatrixBase 的函数的最佳实践是什么?

想法1:编写一个带有DenseBase参数的函数 签名:模板 void foo(DenseBase param) 在函数体内:param.衍生().array() 想法2:写两个函数...

回答 1 投票 0

Eigen Map 没有保留提供的实际数据,看起来实际上是复制数据

正如我从 Eigen::Map 官方教程和文档中了解到的,提供此实用程序是为了用 Eigen 结构包装一些原始数据,而不复制实际的底层数据...

回答 1 投票 0

身份负零

我需要知道此代码是否对计算有任何不利影响 MatrixXd A = -Matrix::Identity(); 它创建带有负数的单位矩阵。打印...

回答 1 投票 0

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

我做了一个 MATLAB 代码,我正在尝试使用 Eigen 库在 C++ 中完成它。在我的 MATLAB 代码中,我必须执行一个像这样的特定函数 M=10; s1 = 零(20,M); 对于 i=1:M s1(:,i) = i*i;%一些函数...

回答 3 投票 0

特征值无法匹配一元函数

我在 Eigen 3.4.0 中遇到编译问题。 具体来说,我有一个用于计算三角形面积的模板函数: 模板 自动三角形区域(const Eigen::

回答 1 投票 0

找不到 Eigen3(缺少:Eigen3_DIR)

我正在尝试在我的项目中使用 Eigen,默认情况下我使用 CMake 构建系统。这是我的 CMakeLists.txt: cmake_minimum_required(版本3.14) 项目(数学版本 0.0 描述“”

回答 1 投票 0

Eigen 库:返回表达式而不是向量本身

是否可以返回某种表达式,然后可以进一步使用和简化,而不是向量本身? 我有一个函数 Vector3 f(Vector3 const&, Vector...

回答 1 投票 0

对于向量,使用 for(size_t i=0; i< size; i++) and for(auto& at:object) happen two different result

int 大小=objects_op->size(); for (auto &at :objects_op->object) { EmObject& at =objects_op->objects().at(i); if (at.sub_type != ObjectType::VISION_PLD) { 继续; }...

回答 1 投票 0

使用 SVD 方法时 Matlab 和 Eigen 结果之间的差异

我正在尝试将之前在 Matlab 中编写的直接线性变换算法重构为 C++。 在比较对矩阵 A 执行 SVD 所得到的矩阵时,我注意到一个很大的

回答 1 投票 0

Eigen:将每一行除以最后一行

使用 Eigen 的行操作时,我不太清楚其语法...... 我有一个特征矩阵,我想将每一行除以最后一行。所以如果我们从一个矩阵开始 r = [ ...

回答 3 投票 0

complex Eigen::VectorX 返回实部或虚部视图

我有一个 Eigen::VectorX> x 并且根据某些参数我想返回 x.real() 或 x.imag()。我不想将其作为 Eigen::VectorX 返回 我有一个 Eigen::VectorX<std::complex<RealType>> x,根据某些参数,我想返回 x.real() 或 x.imag()。我不想将其作为 Eigen::VectorX<RealType> 返回,因为该操作需要堆分配,并且返回某种视图就足够了,因为 x 的存储可以被视为持久的。 有没有办法在这两种情况下返回轻量级视图?不幸的是,x.real()和x.imag()有不同的返回类型。我当前的解决方案是传递一个Eigen::VectorX<RealType>& x,这至少可以防止不必要的堆分配,但仍然是不必要的复制操作。 您可以创建一个跨步映射,其中第一个元素指向第一个实值或第一个虚值(未经测试的代码): template<typename RealType> using RealOrImagView = Eigen::Map<const Eigen::VectorX<RealType>, Eigen::Unaligned, Eigen::InnerStride<2> >; // double can be a template parameter, of course RealOrImagView<double> foo(const Eigen::VectorXcd& input, bool real) { return RealOrImagView<double>(reinterpret_cast<const double*>(input.data()) + (!real), input.size()); }

回答 1 投票 0

是否可以根据数组中指定的值递归地对特征张量进行切片?

我正在尝试在 C++ 中围绕 Eigen::Tensor 对象创建一个包装器。这个想法是基于提供的数组在张量上创建一个碎片视图,该数组要么指定要碎片的行...

回答 1 投票 0

在 Eigen3 中添加矩阵和对角矩阵

我想使用 Eigen3 库(版本 3.3.2)将元素添加到 Eigen::MatrixXd 对象的对角线上。 为了优化和能够使用常量,我想通过添加 dia 来做到这一点...

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.