我想在特征中缩小稀疏基质的行和列.这是我拥有的代码,但不起作用. #include #include #include typedef Eigen::SparseMatrix SpMat; using namespace Eigen; using namespace std; int myrandom (int i) { return std::rand()%i;} int main() { PermutationMatrix perm(5); MatrixXd x = MatrixXd::Random(5,5); SpMat y = x.sparseView(); int dim=5; perm.setIdentity(); for (int i=dim-1; i>0; --i) {
以下是关于 eigen 的编程技术问答
我正在为iPhone 4的eigen库编译而苦苦挣扎,该iPhone 4具有带有ARMV7指令套件的ARM处理器.当我指定预处理器定义eigen_dont_vectorize时,一切正常.但是由于某些性能问题,我想使用ARMV7优化代码. 无论我使用哪个编译器使用LLVM-GCC 4.2或LLVM Clang 2.0,我总是遇到编译错误.我想出(或更好地认为),LLVM-GCC 4.2是访问这些Arm-Neon特定说明的唯一方法. 当我不设置eigen_dont_vectorize(并提供-mfloat -abi = softfp -mfpu = neon到gcc),我会得到以下GCC编译器错误: src/m3corelib/eigen/src/core/core/arch/neon/packetmath.h:89:错误:'__ Extension _____' 我已经阅读了使用"旧" GCC 4.2的问题,并建议使用较新版本的GCC.我不确定,但我认为这不是Ap
我正在使用具有大矩阵的特征,我正在考虑优化代码的方法,重点是减少动态内存分配. 我正在尝试乘以两个矩阵.这些矩阵时不时地改变了一点,但是它们的尺寸保持不变. 我想查看乘法的输出到预定义的矩阵(这已经为其分配了内存). 所以这是我在做什么的示例: Eigen::MatrixXd left, right,result; // ... result = left * right; // ... left and right values change a little result = left * right; ,我正在寻找这样的解决方案: void Multiply( Eigen::MatrixXd const& left, Eigen::MatrixXd const& right, Eigen::MatrixXd& result); void Example() { Eigen::Ma
我在另一个线程,但后来我专注于如何使用OpenCV.未能实现我最初想要的东西,我会在这里询问我想要什么. 我有两个矩阵.矩阵A为2782x128,矩阵B为4000x128,均为无符号char值.值存储在一个数组中.对于a中的每个向量,我需要B中最接近欧几里得距离的B中向量的索引. 好吧,现在我的代码来实现这一目标: #include #include #include #include #include #include #include #include #include #include "main.h" using namespace std; void main(int argc, char* argv[]) { int a_size; unsigned
序言 不久前,我问了一个有关Matlab vs Python的表现的问题( permastion:Matlab vs Python ).我很惊讶Matlab比Python快,尤其是在meshgrid中.在对这个问题的讨论中,我指出我应该使用Python中的包装器调用我的C ++代码,因为我也可以使用C ++代码.我在C ++,Matlab和Python中具有相同的代码. 在这样做的同时,我再次感到惊讶,发现MATLAB在矩阵组装中比C ++快和 Computation.我的代码稍大,我正在研究一段矩阵 - 向量乘法.较大的代码在多个实例中执行此类乘法.总体而言,C ++中的代码比MATLAB快得多(因为MATLAB中调用的函数在头顶上等),但是MATLAB似乎在矩阵矢量乘法中胜过C ++(底部的代码代码段). ). 结果 下表显示了组装内核矩阵所需的时间及其与向量相乘的时间.对矩阵大小NxN编译结果,其中N从10,000到40,000不等.这不是那么大.但是有趣的是
我正在研究性能基准: http://eigen.tuxfamily.orgg/index.php?title =基准 我不禁注意到,特征似乎一贯胜过所有专业供应商库.问题是:怎么可能?人们会假设mkl/goto会使用特定于处理器的调谐代码,而eigen相当通用. 请注意,此 btl-results-1110323/aat.pdf 本质上是DGEMM.对于n = 1000特征大约17GF,MKL仅12GF 解决方案 特征有懒惰的评估.来自 eigen如何与blas/lapack相结合? 对于涉及复杂表达式的操作,特征本质上是 比任何BLAS实现都快,因为它可以处理和优化 在全球范围内整个操作 - 而Blas则迫使程序员前往 将复杂操作分为匹配Blas的小步骤 固定功能API,由于引入而导致效率低下 临时.例如,请参见y = a x + b y的基准结果 涉及两个呼叫Blas Level1例程的操作,而eigen 自动生成一个矢量循环. 其他解决方案 基准被
我可以访问许多矩阵库,但是对于此项目,我正在使用EIGEN,因为它的编译时间定义及其包含SVD. 现在,我正在做以下操作: Eigen::Matrix A; // populated in the code Eigen::Matrix B = A.transpose() * A; 我了解,这使A的副本并形成了转置,该转置再次乘以A.此操作是在相对较小的矩阵上执行的(M = 20-30,n = 3),但每秒数百万次,这意味着它必须尽可能快. 我阅读以下速度更快: B.noalias() = A.transpose() * A; 我可以编写自己接受A作为输入并填充B的子例程,但是我想知道是否有有效的现有实现使用最少的周期. 解决方案 首先,由于特征依赖于模板表达式,A.transpose()不评估临时. 其次,在: Matrix B = A.transpose
eigen已引入了参考类,以特征对象作为参数编写功能,而无需使用不必要的临时性,而不需要编写模板函数.可以阅读有关此在这里. 在进一步搜索Internet时,我使用Ref 类发现了几个不同的参数声明.在第一个示例中,他们使用const Eigen::Ref&在const Eigen::Ref&中使用读取参数.在第二个示例中,引入了用于读取和写入参数的Eigen::Ref,但此处const Eigen::Ref用于仅读取参数(无参考).所以我的问题是: 以下声明和何时使用哪个? 有什么区别? const Eigen::Ref& const Eigen::Ref const Eigen::Ref
我已经根据书籍配方中描述的例程实现了雅各比算法,但是由于我计划与非常大的矩阵一起使用,因此我试图使用OpenMP并行化它. void ROTATE(MatrixXd &a, int i, int j, int k, int l, double s, double tau) { double g,h; g=a(i,j); h=a(k,l); a(i,j)=g-s*(h+g*tau); a(k,l)=h+s*(g-h*tau); } void jacobi(int n, MatrixXd &a, MatrixXd &v, VectorXd &d ) { int j,iq,ip,i; double tresh,theta,tau,t,sm,s,h,g,c; VectorXd b(n); VectorXd z(n); v.setIdentity(); z.setZero(); #pragma omp parallel for for (ip=0;ip
我正在考虑将大型矩阵的倒数,共同大小为1000 x 1000,但有时超过100000 x 100000(目前由于时间和内存而失败).我知道正常的情绪是"不要逆性,找到其他方法",但目前这是不可能的.之所以这样做,是由于已经预期将矩阵倒数的软件的使用情况所致. (注意:我正在研究改变这种情况的方法,但这将需要很长时间) 目前,我们正在使用数值缩写的LU分解方法,目前我正在测试特征库.特征库似乎更稳定,速度更快,但是我仍处于测试阶段的准确性.我已经快速查看了其他图书馆,例如Atlas和Lapack,但尚未对其进行任何实质性测试. 似乎特征库不使用并发方法来计算逆(尽管对于逆的LU分解部分),据我所知,在此限制下,Atlas和Lapack在此限制中相似. (我目前正在测试使用OpenMP和没有的eigen的速度差.) 第一个问题是任何人都可以解释如何通过并行化优化矩阵反转.我找到了一篇文章在这里谈论Matrix逆行Algorithms,但我不明白.看来 this 文章在谈论另
我有一个代码来计算具有期望最大化的高斯混合模型,以便从给定的输入数据样本中识别簇. 代码的一部分正在重复许多试验的模型计算 ntrials (另一个Indepenendet,但使用相同的输入数据),以最终选择最佳解决方案(一个最大化模型的总可能性).这个概念可以推广到许多其他聚类算法(例如k-means). 我想通过使用C ++ 11的多线程进行多个 ntrials 次的代码的一部分并行,以使每个线程都会执行一个试验. 一个代码示例,假设(ndimensions x npoints)的输入Eigen::ArrayXXd sample可以是类型: double bestTotalModelProbability = 0; Eigen::ArrayXd clusterIndicesFromSample(Npoints); clusterIndicesFromSample.setZero(); for (int i=0; i
我正在尝试在macOS上构建一个程序,该程序需要特征version 我去了eigen网站,但是3.3.7来源不再可用. 有解决方法吗? 非常感谢! 更新:非常感谢,但我仍然对如何进行非常困惑.以下是安装详细信息和目录信息的信息. 我想构建的程序源代码的目录看起来像: program cmake Cmakelist.txt build 该程序具有以下说明: Create the build directory in the source tree root mkdir build Configure cmake, from the build directory, passing the Shogun source root as an argument. It is recommended to use any of CMake GUIs (e.g. re
我已经建立了一个自定义软件包,其中一些功能用rcppeigen编写.我还在Intel MKL启用了Microsoft R打开.如何将R软件包链接到Intel MKL功能? 设置1 : 以下是我试图在正常R中与MKL链接的过程,但失败了: 1. #define EIGEN_USE_MKL_ALL 2. link your program to MKL libraries (基于2,在我的文件makevars 中 PKG_CXXFLAGS = -I/opt/intel/mkl/include PKG_LIBS = ${LAPACK_LIBS} ${BLAS_LIBS} ${FLIBS} -L/opt/intel/mkl/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl 我在编译包装时出现了错误: E
我想复制矩阵的每一行M而不会出现任何副本(即创建视图): 0 1 0 1 2 3 -> 0 1 2 3 2 3 M.rowwise().replicate(n)是M.replicate(1,n)的短身,似乎是无用的. 以下片段进行副本,如果M是一种表达式,则无法工作. Eigen::Index rowFactor = 2; Eigen::MatrixXi M2 = Eigen::Map(M.data(), 1, M.size()).replicate(rowFactor, 1); M2.resize(M.rows()*rowFactor, M.cols()) ; 在某些情况下,我可以通过重塑其他操作数来使用中间视图Eigen::Map(M.data(), 1, M.size()).replicate(rowF
我浏览了eigen的教程 它说 "注意:对于担心性能的Blas用户,诸如c.noalias() - = 2 * a.Adjoint() * b;的表达式已完全优化,并触发单个类似Gemm的功能调用." 但是,像h.transpose() * h这样的计算呢时间为h.transpose() * B. eigen对这种情况有特殊优化,例如OpenCV,它具有相似的功能. 我知道对称优化将破坏矢量化,我只想知道eigen是否具有可以提供对称优化和矢量化的解决方案 解决方案 您是对的,您需要告诉Eigen结果是对称的: Eigen::MatrixXd H = Eigen::MatrixXd::Random(m,n); Eigen::MatrixXd Z = Eigen::MatrixXd::Zero(n,n); Z.template selfadjointView().rankUpdate(H.transpose()); 最后一行计算Z