Eigen教程4 - 稀疏矩阵快速参考指南

2023-05-16

博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com


  • 本文对稀疏矩阵SparseMatrix的主要操作进行了总结。首先,建议先阅读《Eigen教程2 - 稀疏矩阵操作》。
  • 关于稀疏矩阵,最重要的一点是:稀疏矩阵的存储方式,是按列优先储存,还是按行优先存储。
  • 绝大多数的稀疏矩阵的算术操作都会断言(判断)操作数的存储方式是否相同。

稀疏矩阵初始化

构造函数

  • 默认列优先。
SparseMatrix<double> sm1(1000,1000);  //创建一个1000x1000的双精度的稀疏矩阵
SparseMatrix<std::complex<double>,RowMajor> sm2; //声明一个复数,行优先的稀疏矩阵

变形和保留

  • 注意:调用reserve()时,没必要给定最终矩阵的准确的非零元素个数。但是,给定准确的非零元素的个数,可以避免多次重新分配内存。
sm1.resize(m,n);      // 将sm1变形成mxn的矩阵
sm1.reserve(nnz);     // 为nnz个非零元素分配空间  

赋值

  • 复制构造函数可以将一种存储顺序变成另一种顺序。
SparseMatrix<double,Colmajor> sm1;
//使用sm1初始化sm2
SparseMatrix<double,Rowmajor> sm2(sm1), sm3;        
// 赋值(自动修改存储顺序)
sm3 = sm1; 

逐元素插入

  • insert()假定该元素不存在;如果元素已经存在,使用coeffRef()。
// 插入一个新元素 
 sm1.insert(i, j) = v_ij;  
// 更新value v_ij
 sm1.coeffRef(i,j) = v_ij;
 sm1.coeffRef(i,j) += v_ij;
 sm1.coeffRef(i,j) -= v_ij;

批插入

std::vector< Eigen::Triplet<double> > tripletList; //三元组列表
tripletList.reserve(estimation_of_entries); //保留非零元素空间
//先填充tripletList,然后将其存储到稀疏矩阵中
sm1.setFromTriplets(TripletList.begin(), TripletList.end());

常量或随机插入

  • 去除所有的非零元素
sm1.setZero()

矩阵属性

  • 下面这些函数可以获取矩阵的信息:
sm1.rows();         // 行数
sm1.cols();         // 列数 
sm1.nonZeros();     // 非零元素的个数   
sm1.outerSize();    // 列优先的稀疏矩阵的行数,行优先的稀疏矩阵的列数
sm1.innerSize();    // 列优先的稀疏矩阵的列数,行优先的稀疏矩阵的行数
sm1.norm();          // 矩阵的欧式范数
sm1.squaredNorm();  //矩阵的平方范数(平方和)
sm1.blueNorm();   // 
sm1.isVector();     // 检查是否是稀疏向量或稀疏矩阵
sm1.isCompressed(); // 检查是否是压缩格式

算术操作

  • 在具有相同存储顺序和维度已知的稀疏矩阵上执行算术操作非常容易。
  • 注意:在不同存储顺序的矩阵间也可以执行算术运算。
  • sm表示稀疏矩阵,dm表示密集矩阵,dv表示密集向量。

加减操作

  • sm1和sm2应具有相同的存储顺序。
sm3 = sm1 + sm2; 
sm3 = sm1 - sm2;
sm2 += sm1; 
sm2 -= sm1; 

标量乘法

  • 只要维度和存储顺序允许,可以组合多种运算。
sm3 = sm1 * s1;   sm3 *= s1; 
sm3 = s1 * sm1 + s2 * sm2; sm3 /= s1;

稀疏乘法

sm3 = sm1 * sm2;
dm2 = sm1 * dm1;
dv2 = sm1 * dv1;

转置 和 伴随矩阵

  • 注意:转置运算改变存储顺序,不支持原地转置运算transposeInPlace()。
sm2 = sm1.transpose();
sm2 = sm1.adjoint();

排列

perm.indices();      // Reference to the vector of indices
sm1.twistedBy(perm); // Permute rows and columns
sm2 = sm1 * perm;    // Permute the columns
sm2 = perm * sm1;    // Permute the columns

逐元素操作

  • sm1和sm2的存储顺序应相同。
sm1.cwiseProduct(sm2);
sm1.cwiseQuotient(sm2);
sm1.cwiseMin(sm2);
sm1.cwiseMax(sm2);
sm1.cwiseAbs();
sm1.cwiseSqrt();

其它支持的操作

子矩阵

  • 相对于密集矩阵,这里的所有函数都是只读的。
sm1.block(startRow, startCol, rows, cols); 
sm1.block(startRow, startCol); 
sm1.topLeftCorner(rows, cols); 
sm1.topRightCorner(rows, cols);
sm1.bottomLeftCorner( rows, cols);
sm1.bottomRightCorner( rows, cols);

Range

  • 在行优先稀疏矩阵中,内向量是指一个行;在列优先稀疏矩阵中,内向量是指一个列。
  • 对于可以读写(RW)的子矩阵,可以在不同存储顺序的矩阵上运算。
sm1.innerVector(outer);           // RW
sm1.innerVectors(start, size);    // RW
sm1.leftCols(size);               // RW
sm2.rightCols(size);              // RO 只读,因为sm2是行优先的
sm1.middleRows(start, numRows);   // RO 只读,因为sm1是列优先的
sm1.middleCols(start, numCols);   // RW
sm1.col(j);                       // RW

三角和自伴随视图

  • 允许三角视图和块视图之间的组合使用。
sm2 = sm1.triangularview<Lower>();
sm2 = sm1.selfadjointview<Lower>();

三角求解

  • 对于一般的稀疏求解,使用《Eigen教程4 - 求解稀疏线性方程组》中合适的模块。
dv2 = sm1.triangularView<Upper>().solve(dv1);
dv2 = sm1.topLeftCorner(size, size).triangularView<Lower>().solve(dv1);

低级API

  • 如果矩阵是非压缩模式,应首先调用makeCompressed()函数。
  • 注意:下面这些函数主要用于和外部库进行交互。
  • 更好的访问矩阵的元素值的方法是使用InnerIterator类,详情查看《Eigen教程2 - 稀疏矩阵操作》
sm1.valuePtr();      // 指向数值的指针
sm1.innerIndextr();  // 指向索引的指针
sm1.outerIndexPtr(); // 指向每一个内向量开头的指针

映射外部缓存

int outerIndexPtr[cols+1];
int innerIndices[nnz];
double values[nnz];
Map<SparseMatrix<double> > sm1(rows,cols,nnz,outerIndexPtr, innerIndices,values); //RW 可读写
Map<const SparseMatrix<double> > sm2(...); //只读
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eigen教程4 - 稀疏矩阵快速参考指南 的相关文章

  • Bringup wifi driver to android 6.0

    1 android root system core rootdir init rc mkdir data misc systemkeys 0700 system system mkdir data misc wifi 0770 wifi
  • global命令详解

    发信人 vale 浅谷 信区 VIM 标 题 global命令详解 发信站 水木社区 Fri Jun 15 17 05 55 2007 站内 global命令是Vim最强大的命令之一 xff08 个人认为是No 1 xff09 xff0c
  • [简单总结] WiFi中的RTS和CTS简单回顾

    通信协议中的RTS CTS协议 xff1a 即请求发送 允许发送协议 xff0c 相当于一种握手协议 xff0c 主要用来解决 34 隐藏终端 34 问题 34 隐藏终端 34 xff08 Hidden Stations xff09 是指
  • 蓝牙技术谈之跳频技术(一)

    跳频技术 Frequency Hopping Spread Spectrum xff1b FHSS 在同步 且同时的情况下 xff0c 接收两端以特定型式的窄频载波来传送讯号 xff0c 对于一个非特定的接收器 xff0c FHSS所产生的
  • Ubuntu自学笔记二

    磁盘管理 dev sd 文件 xff0c 此类文件是磁盘设备文件 xff0c 并不能直接访问磁盘 xff0c 必须要将磁盘挂载到某一个目录下才可以访问 dev sdb和 dev sdb1是U盘的设备文件 xff08 每个人的电脑U盘设备文件
  • 机器视觉设计,如何正确的选择相机和镜头?

    1 相机选择步骤 xff1a 目标物尺码 61 预估实际视场 0 75 根据精度算出分辨率 xff0c 预计出的实际视场 项目要求精度 61 相机的分辨率 根据相机分辨率大小 xff0c 选择合适的相机 xff0c 如果分别率一样的情况下
  • VCC、VDD、VSS以及VBAT的区别

    在STM32 的学习中 xff0c 发现有几种看起来相关的名称 xff0c 分别是VCC VDD VSS VBAT xff0c 在经过搜索查找之后 xff0c 总结如下 xff1a 1 VCC的C是Circuit的意思 xff0c 是指整个
  • vue中单个js写法

    1 vue export default 可以写很多东西 xff0c 包括变量和方法 xff0c 对象等 xff0c 只要是想作为开放的接口都可以写 xff0c 在 vue文件中一般写上data 以及method等 xff0c data指的
  • Ubuntu14.04安装Theano详细教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 因为最近需要学习深度学习 xff0c 因此想要配置Theano xff0c 来开发深度学习算法 但是发现Theano安装总是出
  • Ubuntu-安装-cuda7.0-单显卡-超详细教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 一 说明 本教程是在台式机上安装的 xff0c 只有一个NVIDIA显卡 操作系统是Ubuntu 14 04 64bit 双显
  • 使用Putty无法远程登录,显示服务器拒绝连接

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com putty连接不到linux的原因总结为以下几种情况 局域网内的两台电脑IP冲突 当使用DHCP自动分配IP时 xff0c 两
  • caffe安装系列——综述

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • ls改头换面

    在linux中 xff0c ls命令可以使用颜色来区别不同的文件 路径 权限等等 但是有时候 xff0c ls的颜色配置不是非常合适 例如在黑色的背景下显示蓝色的文字 xff0c 看起来真是费劲啊 要修改颜色配置非常简单 xff0c 可以修
  • caffe安装系列——安装GCC4.7和G++4.7并降级

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装NVIDIA显卡驱动

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装cuda和cudnn

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装Matlab

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装OpenCV

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装python依赖包

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装caffe

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没

随机推荐

  • 服务器维护系列——VNC没有反应了怎么办?

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 服务器维护系列 服务器维护系列 VNC没有反应了怎么办 xff1f 问题描述 服务器上存在多个用户 xff0c 大家通过VNC
  • PCL系列——读入PCD格式文件

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——将点云数据写入PCD格式文件

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • awk one lines

    From http www student northpark edu pemente awk awk1line txt HANDY ONE LINERS FOR AWK 22 July 2003 compiled by Eric Peme
  • PCL系列——拼接两个点云

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——从深度图像(RangeImage)中提取NARF关键点

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——如何可视化深度图像

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——如何使用迭代最近点法(ICP)配准

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——如何逐渐地配准一对点云

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之泊松重构

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之贪婪三角投影算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之移动立方体算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • 解决Ubuntu中文显示为乱码

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 1 安装所需软件 sudo apt get install zh autoconvert sudo apt get insta
  • hexo教程系列——hexo安装教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 本文详细描述了如何在Github上 xff0c 使用hexo部署博客 安装Hexo 安装node js node js官方下载
  • Python中类成员函数均为虚函数的理解

    python中类成员函数均为虚函数 我们可以通过下面的函数见识其威力 class A def foo self print 39 a 39 class B A def foo self print 39 b 39 for x in A B
  • MxNet系列——Windows上安装MxNet

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 开发环境 操作系统 xff1a Win7 64bit C 43 43 编译器 xff1a Visual Studio 2010
  • Eigen教程1 - 基础

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 固定大小的矩阵和向量 参考链接 xff1a http eigen tuxfamily org dox 2 0 Tutorial
  • Eigen教程2 - 入门

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 安装Eigen 无需安装 只需将Eigen位置添加到include路径中 Demo 1 MatrixXd xff0c X表示动
  • Eigen教程3 - 稀疏矩阵操作

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 稀疏矩阵操作 操作和求解稀疏问题需要的模块 xff1a SparseCore SparseMatrix 和 SparseVec
  • Eigen教程4 - 稀疏矩阵快速参考指南

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 本文对稀疏矩阵SparseMatrix的主要操作进行了总结 首先 xff0c 建议先阅读 Eigen教程2 稀疏矩阵操作 关于