草庐IT

c++ - Eigen 中的矩阵乘法非常慢

我已经实现了高斯-牛顿优化过程,该过程涉及通过求解线性化系统Hx=b来计算增量。H矩阵由H=J.transpose()*W*J计算,b由b=J计算。transpose()*(W*e)其中e是误差vector。这里的Jacobian是一个n×6矩阵,其中n以千为单位并且在迭代过程中保持不变,W是一个n×n对角权重矩阵,它将在迭代过程中发生变化(一些对角元素将是设置为零)。但是我遇到了速度问题。当我不添加权重矩阵W时,即H=J.transpose()*J和b=J.transpose()*e,我的高斯-牛顿过程可以在0.02秒内非常快地运行30次迭代。但是,当我添加在迭代循环外定义的W矩阵时

c++ - 对于矩阵乘法,Eigen + MKL 比 Matlab 慢

我在C++程序中进行了大量矩阵乘法运算,我使用与英特尔的MKL(2018.3.222)链接的Eigen(3.3.5)。我使用MKL的顺序版本并且OpenMP被禁用。问题是它比Matlab慢。一些示例代码:#defineNDEBUG#defineEIGEN_USE_MKL_ALL#include#include#includeusingnamespaceEigen;usingnamespacestd;intmain(){MatrixXdjac=100*MatrixXd::Random(10*1228,2850);MatrixXdres=MatrixXd::Zero(2850,2850);

c++ - 编写新的 Eigen 表达式

我正尝试根据最新文档编写新的Eigen表达式https://eigen.tuxfamily.org/dox-devel/TopicNewExpressionType.html.基本上,我想要的是Eigen中仍然缺少的reshape功能的一部分。所以chop_expr(此处为特征向量表达式)应该将输入vectorreshape为n次矩阵。不幸的是,我实现的不适用于分配在堆上的表达式,例如下面的代码不起作用,但在将MAXV更改为10后,一切都变得完美。另一个问题是关于enum{Flags=EvalBeforeNestingBit}我发现我需要它,否则,当我切碎矩阵乘法时,Eigen不会创建

c++ - Eigen :返回对具有编译时维度检查的矩阵 block 的引用

我要问的是thisquestion的概括.具体来说,我想围绕使用2D数据结构的遗留C和Fortran库制作一个C++Eigen包装器:[x[0,0]...x[0,w-1]][u[0,0]...u[0,w-1]][...][x[c-1,0]...x[c-1,w-1]][u[c-1,0]...u[c-1,w-1]]其中每个条目x[i,j]和u[i,j]本身都是大小为(nx1)和(mx1)分别。这会导致一些复杂(且容易出错)的指针算法以及一些非常难读的代码。因此,我想编写一个Eigen类,其唯一目的是尽可能轻松地提取该矩阵的条目。在C++14中,它看起来像这样data_getter.h:#i

c++ - Eigen是否假设混叠?

MatrixmultiplicationistheonlyoperationinEigenthatassumesaliasingbydefault.MatrixXfmat1(2,2);mat1Eigen在临时矩阵中计算乘积mat1*mat2,然后在计算后用于初始化result。由于result没有出现在右侧,我们不需要别名:MatrixXfresult;result.noalias()=mat1*mat2;现在,乘积mat1*mat2直接计算为result。到目前为止,还不错。但是在这种情况下会发生什么?templateautomultiplication(constT1&A,cons

c++ - Eigen:从 C++ 数组高效实现矩阵

是否可以实现一个接收C风格指针作为模板参数并以某种方式解析为静态特征矩阵但使用提供的内存的类?假设一个声明看起来像这样:EIGEN_ALIGN16doublearray[9];CMatrix::m;我确实了解映射,但我在下面提供的示例代码已证明,与静态特征矩阵相比,它们的速度要慢20%。前提是:我需要提供我自己的C指针。这样我就可以高效地重用C代码而不会产生拷贝。生成的矩阵对于Eigen而言应该是静态的,以便Eigen可以像在编译时使用静态数组一样进行优化。看看我上面的例子,在编译时我会提供矩阵大小(静态)和C指针。CMatrix应该退回到Eigen::Matrix。如果未提供C数组的

C++ Eigen 稀疏矩阵乘法比 python scipy.sparse 慢得多

编辑:性能上的巨大差异是由于测试中的错误造成的,如果设置正确,Eigen会快2到3倍。我注意到使用C++的稀疏矩阵乘法Eigen库比使用Python慢得多scipy.sparse图书馆。我在~0.03秒内在scipy.sparse中实现了在~25秒内在Eigen中实现的效果。也许我在Eigen中做错了什么?这里是Python代码:fromscipyimportsparsefromtimeimporttimeimportrandomasrnN_VALUES=200000N_ROWS=400000N_COLS=400000rows_a=rn.sample(range(N_COLS),N_V

c++ - 将动态矩阵转换为 Eigen 中的固定矩阵

为了灵active,我使用C++库Eigen将数据加载到动态大小的矩阵(例如Eigen::MatrixXf)。我编写了一些需要混合或固定大小矩阵作为参数的函数(例如Eigen::Matrix或Eigen::Matrix4f)。假设我对行和列大小进行了正确的断言,我如何将动态矩阵(大小在运行时设置)转换为固定矩阵(大小在编译时设置)?我能想到的唯一解决办法就是映射,例如:Eigen::MatrixXfdyn=Eigen::MatrixXf::Random(3,100);Eigen::Matrixfixed=Eigen::Map(dyn.data(),3,dyn.cols());但我不清楚

c++ - 使用 nvcc (CUDA) 编译 Eigen 库

我尝试使用nvcc(CUDA5.0RC)编译以下程序(main.cu):#include#includeintmain(intargc,char**argv){std::cout不幸的是,我收到了一堆警告和错误,我只能使用nvcc而不是Microsoft编译来解释。这个假设对吗?有什么办法可以用nvcc编译Eigen吗?(我实际上不想将特征矩阵传输到GPU,只是访问它们的成员)?如果使用nvcc编译Eigen不可行,是否有关于分离主机和设备代码的巧妙方法的很好的指南/教程?我正在使用CUDA5.0RC、VisualStudio2008、Eigen3.0.5。为了编译.cu文件,我同时使

c++ - 通过模板发布 C++ Eigen::Matrix 类型

我正在编写一个根据类型(float或double)模板化并使用Eigen::Matrix的C++函数在内部。该函数将使用float的组合,double,和模板化类型Eigen:Matrix对象。Eigen::Matrix::cast()适用于double和float,尽管我在将它与模板化类型一起使用时遇到了一个奇怪的问题。见下面的代码:#include"Eigen/Core"//Version3.2.4(eigen-eigen-10219c95fe65)templatevoidFoo(){Eigen::Matrixmat_d=Eigen::Matrix::Zero();Eigen::M