[Eigen] Issues when using Eigen

1. Efficient Expression

Refer to this post http://eigen.tuxfamily.org/dox/TopicWritingEfficientProductExpression.html, for dense matrix calculation.

But what about sparse matrix product??

What does Eigen do when:

- [Enhancement, unsolved] Sparse matrix product –> Sparse m? dense matrix and vector? Does it make itself dense first?

Is this expression fast when using SpMat? When a_, y_, lambda_*_,  is a (dense) vector, penalty_ a scalar?

a_ = - penalty_ * (A_.transpose() * y_)
    + A_.transpose() * lambda_y_
    + Q_.transpose() * lambda_stf_;

or this one better following the post above?

a_ = - penalty_ * (A_.transpose() * y_);
a_.noalias() += A_.transpose() * lambda_y_;
a_.noalias() += Q_.transpose() * lambda_stf_;

- [Enhancement, unsolved] Will it be faster to use sparse vector when do multiplication with sparse matrix, instead of dense one?

- [Bugs, unsolved] When I ran the following I got bugs:

VX dual_res_v         = -lambda_stf_.transpose() * (Q_ - Q_new);
dual_res_v.noalias() += - penalty_ * (y_ - y_prev).transpose() * A_;
dual_res_v.noalias() += - (lambda_y_ - lambda_y_prev).transpose() * A_;
dual_res_v.noalias() += penalty_ * x_.transpose() * (Q_ - Q_new).transpose() * Q_;

Where VX is dense vector in Eigen, and lambda_*_, y_* and x_* are dense vector, Q_ and A_ are sparse matrix.

The index is compatible. The following lines work fine in my code:

VX dual_res_v = -lambda_stf_.transpose() * (Q_ - Q_new)
    - penalty_ * (y_ - y_prev).transpose() * A_
    - (lambda_y_ - lambda_y_prev).transpose() * A_
    + penalty_ * x_.transpose() * (Q_ - Q_new).transpose() * Q_;

But I don’t know what’s wrong with the new one.

时间: 2024-12-15 10:23:40

[Eigen] Issues when using Eigen的相关文章

Eigen教程(1)

整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 简介 Eigen是C++中可以用来调用并进行矩阵计算的一个库,简单了说它就是一个c++版本的matlab包. 安装 下载eigen:http://eigen.tuxfamily.org/index.php?title=Main_Page#Download Eigen只包含头文件,因此它不需要实现编译,只需要你include到你的项目,指定好Eigen的头文件路径,编译项目即可.而且

Eigen

C++矩阵处理工具--Eigen 最近和一些朋友讨论到了C++中数学工具的问题,以前总是很2地自己写矩阵运算,或者有时候在matlab里计算了一些数据再往C程序里倒,唉~想想那些年,我们白写的代码啊--人家早已封装好了!首先推荐几个可以在C++中调用的数学平台:eigen.bias.lapack.svd.CMatrix,本文着重eigen做以讲解,希望对各位有所帮助. 下面是本文主线,主要围绕下面几点进行讲解: ******************************************

Boost,Eigen,Flann—C++标准库预备役

Boost,Eigen,Flann—C++标准库预备役 第一预备役:Boost Boost库是为C++语言标准库提供扩展的一些C++程序库的总称. Boost库由Boost社区组织开发.维护.其目的是为C++程序员提供免费.同行审查的.可移植的程序库.Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能.Boost库使用Boost License来授权使用,根据该协议,商业的非商业的使用都是允许并鼓励的. Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boo

C++调用Matlab引擎及Eigen配置

这个周开始要着手实现网格水印的代码了,虽然还什么都不会,但也只能一步步摸索着往前走了. 我要实现的论文题目是<<Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain>>,之前的博客中有过这篇论文的理论分析,看起来貌似不难,但动手实现起来的时候还是挺困难的.首先要解决的问题就是配置实验环境. 一开始我打算用Eigen对拉普拉斯矩阵进行特征值分解,因此就涉及到Eigen的配置.Eigen是一个开源的矩阵运算库,里面封装

调用opencv时,使用Egien工具出现“error C2061: 语法错误: 标识符“Matrix””和“error C2653: “Eigen”:不是类或命名空间名称”该如何解决?

这个问题主要是由于头文件的编译问题引起的. 1.如果没有Eigen工具的,先下载Egien工具并配置. Egien可以去主页下载.配置时,打开你的c++工程属性页:配置属性->C/C++->常规->附加包含目录,然后添加你下载的Eigen的文件夹的路径即可.我的配置是: 2.配置好的,在编译时出现这种问题,主要是由于头文件的编译顺序问题. 如果按照下面这种顺序: #include <opencv2/core/eigen.hpp> #include <Eigen>

c++处理矩阵操作:Eigen库初步学习使用

前言: Eigen 是一个线性算术的C++模板库,包括:vectors, matrices, 开源以及相关算法.功能强大.快速.优雅以及支持多平台,可以使用该库来方便处理一些矩阵的操作,达到类似matlab那样的快捷.现在已经发展到Eigen3了,目前最新版本为Eigen 3.1.2. Eigen使用预备工作: 首先到Eigen官网上下载Eigen源码包,下载后解压完直接放到自己平时软件所在的目录下,不需要安装.Eigen下载地址为:http://eigen.tuxfamily.org/inde

Eigen与MATLAB使用对照表

// A simple quickref for Eigen. Add anything that's missing. // Main author: Keir Mierle #include <Eigen/Dense> Matrix<double, 3, 3> A; // Fixed rows and cols. Same as Matrix3d. Matrix<double, 3, Dynamic> B; // Fixed rows, dynamic cols.

C++图像辅助工具包Eigen入门代码学习(很好的配合Opencv)

首先要说这个工具包非常的方便,解压出来就可以用了.在工程里面加入这个文件夹的路径就可以了. 下面是一些代码的练习: #include <iostream> #include <Eigen/Dense> using namespace Eigen; using namespace std; int main() { MatrixXd m = MatrixXd::Random(3,3); MatrixXd n; n=MatrixXd::Constant(3,3,1.2); //这是一个

算法库:eigen安装配置

下载eigen并解压到C:\eigen C:\eigen目录中有: bench,  blas, cmake, Eigen, README.md等目录或文件. vc++包含目录添加: C:\eigen 源文件看包含: #include <Eigen/Dense> 使用命名空间: using namespace Eigen;