标签: eigen3

对于矩阵乘积的Cholesky,Eigen和C++ 11类型推断失败

我试图使用Eigen和C++ 11"auto"类型对其转置矩阵的乘积进行cholesky分解.我试图做的时候出现问题

auto c = a * b
auto cTc = c.tranpose() * c;
auto chol = cTc.llt();
Run Code Online (Sandbox Code Playgroud)

我正在使用XCode 6.1,Eigen 3.2.2.我得到的类型错误在这里.

这个最小的例子显示了我的机器上的问题.更改的类型cautoMatrixXd看到它的工作.

#include <iostream>
#include <Eigen/Eigen>
using namespace std;
using namespace Eigen;


int main(int argc, const char * argv[]) {
    MatrixXd a = MatrixXd::Random(100, 3);
    MatrixXd b = MatrixXd::Random(3, 100);
    auto c = a * b;
    auto cTc = c.transpose() * c;
    auto chol = cTc.llt();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个工作仍然使用自动?

作为一个侧面问题,是否有一个表现理由不断言矩阵是MatrixXd …

c++ eigen auto c++11 eigen3

8
推荐指数
2
解决办法
927
查看次数

特征对齐问题

文档中列出的Eigen的内存对齐问题是否仍然适用于C++ 11?似乎C++ 11已经能够正确地对齐堆栈上和堆上的对象,alignas并且std::allocator支持对齐.

memory-alignment eigen c++11 eigen3

8
推荐指数
1
解决办法
862
查看次数

特征 - 检查矩阵是否为正(半)确定

我正在实现一个谱聚类算法,我必须确保矩阵(laplacian)是正半正定的.

检查矩阵是否为正定(PD)就足够了,因为可以在特征值中看到"半"部分.矩阵非常大(nxn,其中n约为数千),因此特征分析是昂贵的.

在Eigen中是否有任何检查可以在运行时产生bool结果?

chol()如果矩阵不是PD,Matlab可以通过抛出异常来给出结果.遵循这个想法,Eigen返回一个没有抱怨的结果LLL.llt().matrixL(),虽然我期待一些警告/错误.Eigen也有这种方法isPositive,但是由于一个bug,它对于具有旧Eigen版本的系统是不可用的.

c++ eigen eigen3

8
推荐指数
2
解决办法
5989
查看次数

模糊的递归模板功能

在C++ 11中,我需要递归地调用一个函数0,...,n(其中n是编译时常量).这是问题的结构,似乎存在致命缺陷:

#include "Eigen/Dense"

template<size_t i>
struct Int {
};

template<size_t d, typename C, typename X>
constexpr X eval(const C &c, const X &x, const Int<d> &, const Int<C::SizeAtCompileTime - 1 - d> &) {
    return 1;
}

template<size_t d, typename C, typename X, size_t i>
constexpr X eval(const C &c, const X &x, const Int<d> &, const Int<i> &) {
    return x * eval(c, x, Int<d>(), Int<i + 1>());
}

int main() {
    const size_t …
Run Code Online (Sandbox Code Playgroud)

c++ templates eigen c++11 eigen3

8
推荐指数
1
解决办法
280
查看次数

为什么Eigen对别名的默认假设不一致?

作为Eigen的新手,我要努力应对一些问题。

使用矩阵乘法,Eigen默认情况下会创建一个临时文件以避免混叠问题:

matA = matA * matA; // works fine (Eigen creates a temporary before assigning)
Run Code Online (Sandbox Code Playgroud)

如果可以安全地假定没有混叠,则可以使用.noalias()进行优化:

matB = matA * matA; // sub-optimal (due to unnecessary temporary)
matB.noalias() = matA * matA; // more efficient
Run Code Online (Sandbox Code Playgroud)

因此,Eigen在默认情况下会避免做出不安全的假设,除非明确告诉您可以假设没有混叠是安全的。到目前为止,一切都很好。

但是,对于许多其他表达式,例如a = a.transpose()Eigen,默认情况下会做出不安全的假设(没有混叠问题),并且需要显式干预以避免该不安全的假设:

a = a.transpose().eval(); // or alternatively: a.transposeInPlace()
Run Code Online (Sandbox Code Playgroud)

因此,如果我们关注效率,则仅当存在潜在的混叠时才注意不够,而在没有潜在的混叠时则不足以注意。我们必须要小心,当有潜在的混淆,并且在没有潜在的混淆,并决定一个特殊的干预措施是有保证的基础上,表达是否涉及矩阵乘法与否。在Eigen中,对于Eigen界面中的这种“默认期望混合”是否有一些设计依据?

c++ eigen eigen3

8
推荐指数
1
解决办法
114
查看次数

编译特征程序时出错:错误:“seq”不是“特征”的成员

我试图在遵循等差数列的索引中对矩阵进行索引。根据官网的 Eigen 教程,我应该使用 Eigen::seq(firstVal, lastVal, step) 来生成这个序列。调用此错误后,会弹出此线程的标题中粘贴的错误。

我检查了本地 eigen 文件夹的所有文件,以获取“seq”方法,但没有运气。它不在任何地方。我想这意味着某些文件丢失了,对吧?

代码就像这样。

顶部的标题

#include <iostream>
#include <string>
#include <chrono>
#include "Eigen/Dense"
#include "Eigen/Core"
#include <cmath>
#include <random>
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
#include <string>
#include <chrono>
#include "Eigen/Dense"
#include "Eigen/Core"
#include <cmath>
#include <random>
Run Code Online (Sandbox Code Playgroud)

当然,m1.cols() >> m2.cols()

错误输出:

error: 'seq' is not a member of 'Eigen'
Run Code Online (Sandbox Code Playgroud)

预期的结果是从矩阵 m2 中获取行(其中 m2.cols() < m1.cols())并将行的值分配给 m1 相同行号中的某些索引。

c++ eigen3

8
推荐指数
2
解决办法
3952
查看次数

为什么 Eigen 默认使用列优先而不是行优先?

虽然Eigen是C++库并且C/C++使用行优先存储结构,但为什么Eigen更喜欢使用列优先存储顺序?来自为什么 MATLAB 使用列优先顺序?帖子中,我了解到 MATLAB 使用它是因为历史(由于 FORTRAN)原因。但据我所知,Eigen 一开始是基于 C++ 构建的。

在 Eigen 图书馆网站上写道:

Eigen 中的默认值是列优先。当然,Eigen 库的大部分开发和测试都是通过列主矩阵完成的。这意味着,即使我们的目标是透明地支持列主和行主存储顺序,Eigen 库也可能最适合列主矩阵。(取自https://eigen.tuxfamily.org/dox/group__TopicStorageOrders.html

也许是因为经常使用 C++ 和 OpenCV,我的大脑倾向于以行优先的形式思考。使用列主矩阵开发和测试 Eigen 库是否存在任何性能(缓存局部性、加载/存储速度等)原因?

c++ eigen eigen3

8
推荐指数
1
解决办法
5406
查看次数

无法编译 Eigen SVD 的示例

我正在尝试编译为Eigen::JacobiSVD提供的示例,但出现以下错误,

\n
/usr/local/include/eigen3/Eigen/src/SVD/JacobiSVD.h: In instantiation of \xe2\x80\x98Eigen::JacobiSVD<MatrixType, QRPreconditioner>& Eigen::JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType&, unsigned int) [with _MatrixType = Eigen::Matrix<float, -1, -1>; int QRPreconditioner = 40; Eigen::JacobiSVD<MatrixType, QRPreconditioner>::MatrixType = Eigen::Matrix<float, -1, -1>]\xe2\x80\x99:\n/usr/local/include/eigen3/Eigen/src/SVD/JacobiSVD.h:549:14:   required from \xe2\x80\x98Eigen::JacobiSVD<MatrixType, QRPreconditioner>::JacobiSVD(const MatrixType&, unsigned int) [with _MatrixType = Eigen::Matrix<float, -1, -1>; int QRPreconditioner = 40; Eigen::JacobiSVD<MatrixType, QRPreconditioner>::MatrixType = Eigen::Matrix<float, -1, -1>]\xe2\x80\x99\ndemo.cpp:9:55:   required from here\n/usr/local/include/eigen3/Eigen/src/SVD/JacobiSVD.h:692:27: error: \xe2\x80\x98struct Eigen::internal::qr_preconditioner_impl<Eigen::Matrix<float, -1, -1>, 40, 0, true>\xe2\x80\x99 has no member named \xe2\x80\x98run\xe2\x80\x99\n     m_qr_precond_morecols.run(*this, m_scaledMatrix);\n     ~~~~~~~~~~~~~~~~~~~~~~^~~\n/usr/local/include/eigen3/Eigen/src/SVD/JacobiSVD.h:693:27: error: \xe2\x80\x98struct Eigen::internal::qr_preconditioner_impl<Eigen::Matrix<float, -1, -1>, 40, 1, true>\xe2\x80\x99 …
Run Code Online (Sandbox Code Playgroud)

c++ eigen3

8
推荐指数
1
解决办法
1351
查看次数

编译器、库或用户错误?Eigen::Array,GCC 12.1,“数组下标 [...] 部分超出数组边界”

更新到 GCC 12.1 后,我的项目中出现array subscript \xe2\x80\x98__m256d_u[0]\xe2\x80\x99 is partly outside array bounds错误(或者更确切地说带有 的警告-Werror),因此我尝试隔离问题。

\n

这是一个 MWE,我也将其放在godbolt上(改为矢量类型__m512d_u,但否则是相同的错误):

\n
#include <Eigen/Dense>\n#include <iostream>\n\nusing Eigen::Array;\n\nArray<double, 3, 2> foo(){\n\n    Array<double, 2, 2> a;\n    a.setRandom();\n\n    Array<double, 3, 2> b;\n    b.col(0).tail(2) = a.col(1);\n    // b.col(0).template tail<2>() = a.col(1);\n\n    return b;\n}\n\nint main(){\n    std::cout << foo() << \'\\n\';\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

相关的编译选项有-Wall -Wextra -Werror -O3 -march=native,以及错误信息注释note: at offset [16, 24] into object \xe2\x80\x98a\xe2\x80\x99 of size 32

\n

在以下情况下不会出现该错误: …

c++ arrays vectorization eigen eigen3

8
推荐指数
0
解决办法
845
查看次数

特征和巨大的密集2D阵列

我正在将2D Eigen::Array用于项目,我喜欢在大型2D阵列的情况下继续使用它们.

为了避免内存问题,我想使用内存映射文件来管理(读取/修改/写入)这些数组,但我找不到工作示例.

我发现最近的例子是基础上boost::interprocess,但它使用的共享内存(而我更愿意有持久存储).

缺乏示例让我担心是否有更好的主流替代解决方案来解决我的问题.是这样的吗?一个最小的例子非常方便.

编辑:

这是在评论中解释我的用例的最小示例:

#include <Eigen/Dense>


int main()
{
    // Order of magnitude of the required arrays
    Eigen::Index rows = 50000;
    Eigen::Index cols = 40000;

    {
        // Array creation (this is where the memory mapped file should be created)
        Eigen::ArrayXXf arr1 = Eigen::ArrayXXf::Zero( rows, cols );

        // Some operations on the array
        for(Eigen::Index i = 0; i < rows; ++i)
        {
            for(Eigen::Index j = 0; j < cols; ++j)
            {
                arr1( i, …
Run Code Online (Sandbox Code Playgroud)

c++ memory-mapped-files multidimensional-array eigen eigen3

7
推荐指数
2
解决办法
370
查看次数