[Eigen中文文档] 稀疏矩阵快速参考指南

news/2024/4/21 1:10:50/

文档总目录

本文目录

      • 稀疏矩阵初始化
        • 构造
        • 重置大小/预分配内存空间
        • 赋值
        • 逐元素插入
        • 批量插入
        • 指定位置或随机插入
      • 矩阵属性
      • 算术运算
        • 加减
        • 标量积
        • 稀疏矩阵乘积
        • 转置/伴随
        • 排列
        • 组件级操作
      • 其他支持的操作
        • 子矩阵
        • 范围操作
        • 三角形和自伴随视图
        • 三角形求解
        • 低级API
        • 映射外部缓冲区

英文原文(Quick reference guide for sparse matrices)

本页面简要介绍了类SparseMatrix中可用的主要操作。首先,建议先阅读介绍性教程《稀疏矩阵操作》。在处理稀疏矩阵时,重要的一点是要了解它们的存储方式:即行优先或列优先,Eigen默认为列优先。对稀疏矩阵进行的大多数算术操作都会默认它们具有相同的存储顺序。

稀疏矩阵初始化

构造

SparseMatrix<double> sm1(1000,1000); 
SparseMatrix<std::complex<double>, RowMajor> sm2;

默认为列优先。

重置大小/预分配内存空间

sm1.resize(m,n);      // Change sm1 to a m x n matrix. 
sm1.reserve(nnz);     // Allocate room for nnz nonzeros elements.

请注意,调用 Reserve() 时,不需要 nnz 是最终矩阵中非零元素的确切数量。通过给出一个精确的估计值可以避免在插入阶段进行多次重新分配内存。

赋值

SparseMatrix<double,Colmajor> sm1;
// Initialize sm2 with sm1.
SparseMatrix<double,Rowmajor> sm2(sm1), sm3;        
// Assignment and evaluations modify the storage order.
sm3 = sm1; 

拷贝构造函数可用于从一种存储顺序转换为另一种存储顺序。

逐元素插入

// Insert a new element; 
sm1.insert(i, j) = v_ij;  // Update the value v_ij
sm1.coeffRef(i,j) = v_ij;
sm1.coeffRef(i,j) += v_ij;
sm1.coeffRef(i,j) -= v_ij;

insert() 函数假设该元素在矩阵中不存在;如果该元素已经存在,请使用 coeffRef() 函数。

批量插入

std::vector< Eigen::Triplet<double> > tripletList;
tripletList.reserve(estimation_of_entries);
// -- Fill tripletList with nonzero elements...
sm1.setFromTriplets(TripletList.begin(), TripletList.end());

Triplet Insertion 提供了完整的示例。

指定位置或随机插入

sm1.setZero();

删除所有非零系数。

矩阵属性

除了基本函数 rows()cols() 之外,还有一些有用的函数可用于从矩阵中获取一些信息。

sm1.rows();         // Number of rows
sm1.cols();         // Number of columns 
sm1.nonZeros();     // Number of non zero values   
sm1.outerSize();    // Number of columns (resp. rows) for a column major (resp. row major )
sm1.innerSize();    // Number of rows (resp. columns) for a row major (resp. column major)
sm1.norm();         // Euclidian norm of the matrix
sm1.squaredNorm();  // Squared norm of the matrix
sm1.blueNorm();
sm1.isVector();     // Check if sm1 is a sparse vector or a sparse matrix
sm1.isCompressed(); // Check if sm1 is in compressed form
...

算术运算

只要矩阵的维度合适并且矩阵具有相同的存储顺序,就可以轻松地在稀疏矩阵上执行算术运算。请注意,始终可以在具有不同存储顺序的矩阵中进行计算或处理数学表达式或函数。在下面的文本中,sm 表示稀疏矩阵,dm 表示密集矩阵,dv 表示密集向量。

加减

sm3 = sm1 + sm2; 
sm3 = sm1 - sm2;
sm2 += sm1; 
sm2 -= sm1; 

sm1sm2应该有相同的存储顺序。

标量积

sm3 = sm1 * s1;   sm3 *= s1; 
sm3 = s1 * sm1 + s2 * sm2; sm3 /= s1;

如果尺寸和存储顺序一致,则可以进行多种计算组合。

稀疏矩阵乘积

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

转置/伴随

sm2 = sm1.transpose();
sm2 = sm1.adjoint();

请注意,转置会更改存储顺序。不支持 transposeInPlace()

排列

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.cwiseProduct(sm2);
sm1.cwiseQuotient(sm2);
sm1.cwiseMin(sm2);
sm1.cwiseMax(sm2);
sm1.cwiseAbs();
sm1.cwiseSqrt();

sm1sm2 应该有相同的存储顺序。

其他支持的操作

子矩阵

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);

与稠密矩阵相反,这里所有方法都是只读的。 有关读写子矩阵,请参阅块操作及下文。

范围操作

sm1.innerVector(outer);           // RW
sm1.innerVectors(start, size);    // RW
sm1.leftCols(size);               // RW
sm2.rightCols(size);              // RO because sm2 is row-major
sm1.middleRows(start, numRows);   // RO because sm1 is column-major
sm1.middleCols(start, numCols);   // RW
sm1.col(j);                       // RW

内部向量可以是行(对于行优先)或列(对于列优先)。 如前所述,对于读写子矩阵(RW),可以在具有不同存储顺序的矩阵中进行。

三角形和自伴随视图

sm2 = sm1.triangularview<Lower>();
sm2 = sm1.selfadjointview<Lower>();

三角形视图和块视图之间的多种组合是可能的。

三角形求解

dv2 = sm1.triangularView<Upper>().solve(dv1);
dv2 = sm1.topLeftCorner(size, size).triangularView<Lower>().solve(dv1);

对于一般稀疏矩阵求解,请使用 求解稀疏线性系统 中描述的合适的模块。

低级API

sm1.valuePtr();      // Pointer to the values
sm1.innerIndexPtr();  // Pointer to the indices.
sm1.outerIndexPtr(); // Pointer to the beginning of each inner vector

如果矩阵不是压缩形式,应在调用这些函数之前使用 makeCompressed() 函数进行压缩。 请注意,这些函数主要提供与外部库的互操作性。更好地访问矩阵的值是通过使用InnerIterator类来完成的,如 Tutorial Sparse 部分所述。

映射外部缓冲区

innerIndices[nnz];
double values[nnz];
Map<SparseMatrix<double> > sm1(rows,cols,nnz,outerIndexPtr, // read-writeinnerIndices,values);
Map<const SparseMatrix<double> > sm2(...);                  // read-only

对于稠密矩阵,类 Map<SparseMatrixType> 可用于将外部缓冲区视为 Eigen 的 SparseMatrix 对象。


http://www.ppmy.cn/news/572702.html

相关文章

http请求头部(header)详解

当我们在浏览器中访问一个网站时&#xff0c;我们的浏览器实际上会向该网站发送一个 HTTP 请求。而 HTTP 请求头部&#xff08;Header&#xff09;则是一组包含请求信息的键值对&#xff0c;用来描述 HTTP 请求的各种属性和特征。以下是 HTTP 请求头部的一些常见属性和含义&…

Spring boot开发小而美的个人博客

1、功能 2、页面设计与开发 2.1设计 前端展示&#xff1a;首页、详情页、分类、标签、归档、关于我 后台管理&#xff1a;模板页 2.2页面开发 创建blog 在blog里创建static文件夹&#xff0c;在static里面创建css、images、js文件夹 创建index.html文件 页面头部加底部 …

HTML从入门到入土 - CSS基础

date: 2018-06-29 17:59:35 假装高产似那啥&#xff0c;虽然我6月29号下午六点就创建了文章&#xff0c;直到7月1号23点53才最终完成。身为html&#xff0c;自然少不了css去修饰&#xff0c;这篇就说一下css的基础知识、盒子模型、cssdiv和1-2-1等布局方式。 什么是CSS CSS是…

付费订阅模式的3个好处

跨境电商最近的购物旺季火热进行中&#xff0c;每一次购物高峰期都与节日密切相关&#xff0c;跨境电商卖家生意爆单会离不开的节日大促&#xff0c;因此关注每年的大促时间点非常重要。 现在海外的疫情越发严重&#xff0c;尽管就在几个月前&#xff0c;人们还希望在这个假期…

靠着这Java面试210题,成功拿下了10多家国内知名大厂Offer,10万字精华全部分享给大家

写在前面 我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的知识和面试经验,为将来进入更好的公司做好充分的准备&#xff01; 如何让面试官在短短的几十分钟内认可你的能力? 如何在最短的时间内收获Java技术栈最核心的知识点 这份内容可以算…

c++算法总结

c算法学习 DFS79单词搜索237 二叉树的最近公共祖先207课程表437 路径综合Ⅲ494 目标和541 二叉树的直径399 除法求值129求根节点到叶节点数字之和 BFS542矩阵207课程表112路径总和 动态规划139单词分解279 完全平方数300 最长递增子序列309 最佳买卖股票时机 含冷冻期332 零钱兑…

力扣LeetCode刷题笔记总结2

题型十三&#xff1a;二叉树 0.二叉树的基础知识 &#xff08;1&#xff09;二叉树的分类&#xff1a; a. 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 b.完全二叉树&…

LeetCode 101Pro

LeetCode 101 本文档是对LeetCode101中题目的详细解释和扩展。文章目录 LeetCode 101第一章 题目分类第二章 最易懂的贪心算法2.1 算法解释2.2 分配问题455. 分发饼干135. 分发糖果 2.3 区间问题455. 无重叠区间 2.4 练习605. 种花问题452. 用最少数量的箭引爆气球763. 划分字…

2022年SCAU计算智能题库

目录 头文件及宏定义 基础 18104 练习使用多case解题 注意事项&#xff1a; 代码实现&#xff1a; 递归和分治 (Recursion and Divide and Conquer) 1142 巡逻的士兵 注意事项&#xff1a; 代码实现&#xff1a; 18441 偷懒的士兵 注意事项&#xff1a; 代码实现&a…

一些可以参考的文档集合8

一些可以参考的文档集合7_xuejianxinokok的博客-CSDN博客 之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_…

河工计院ACM2022寒假培训题单以及超详细题解

目录 货仓选址 校门外的树 奖学金 蛇形矩阵 找硬币 回文平方 品种邻近 平方矩阵 II 十三号星期五 阶乘 干草堆 火星人 整数集合划分 最大的和 剪绳子 分巧克力 a^b 数独检查 ISBN号码 COW 红与黑 棋盘挑战 不高兴的津津 马蹄铁 跳一跳 折点计数 最…

【Linux 驱动篇(一)】字符设备驱动开发

文章目录 一、字符设备驱动简介二、字符设备驱动开发步骤1. 驱动模块的加载和卸载2. 字符设备注册与注销3. 实现设备的具体操作函数3.1 能够对 chrtest 进行打开和关闭操作3.2 对 chrtest 进行读写操作 4. 添加 LICENSE 和作者信息 三、Linux 设备号1. 设备号的组成 一、字符设…

拿命 3 天肝出来的计算机考研数据结构与算法复习笔记(超详细教程,更新中)

数据结构与算法 基本概述 数据结构指的是“一组数据的存储结构”&#xff0c;算法指的是“操作数据的一组方法”。 数据结构是为算法服务的&#xff0c;算法是要作用再特定的数据结构上的。 最常用的数据结构预算法 数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉…

恶意文件分类

木马文件(Tronjan) 1.1 病毒介绍 木马病毒是指隐藏在正常程序中的一段具有特殊功能的恶意代码&#xff0c;是具备破坏和删除文件、发送密码、记录键盘和攻击Dos等特殊功能的后门程序。木马病毒其实是计算机黑客用于远程控制计算机的程序&#xff0c;将控制程序寄生于被控制的…

蓝桥杯C++AB算法辅导

文章目录 1.1 教学计划与递归92. 递归实现指数型枚举94. 递归实现排列型枚举717. 简单斐波那契95. 费解的开关 1.2 递推与递归——习题课93. 递归实现组合型枚举1209. 带分数116. 飞行员兄弟1208. 翻硬币 2.1 二分与前缀和789. 数的范围790. 数的三次方根795. 前缀和796. 子矩阵…

Codeforces Round #780 (Div. 3)(A~F1)

A. Vasya and Coins 题意:瓦西娅决定去杂货店。他在他的钱包里发现了 1 1 1 颗豆的硬币和 2 2 2 颗豆的硬币。他还不知道所有商品的总成本&#xff0c;所以帮他找出 s s s ( s > 0 ) (s>0) (s>0) :他不找零钱就不能支付的最小正整数&#xff0c;或者只用硬币就不…

LeetCode高频题刷题笔记(十四)动态规划

基础知识 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP。 动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 题目 1. 爬楼梯&#xff08;…

企业机试面试记录

企业机试面试记录 企业机试2023-03-11 美团机试第一题第二题第三题第四题第五题 2023-03-12 拼多多机试第一题 多多的压缩编码II第二题 多多的飞机大战游戏第三题 多多的团建计划第四题 多多的餐厅客流量 2023-3-15 阿里机试第一题第二题第三题 2023-3-16 蚂蚁机试第一题 整数抽…

最短路

文章目录 最短路1. 算法分析1.1 图论最短/长路模型1.2 图论建模技巧 2. 板子2.1 dijkstra朴素版本求最短路 (O(n2)):适合稠密图&#xff0c;用邻接矩阵存储&#xff0c;不能处理有负权边情况2.2 dijkstra堆优化版本求最短路 (O(mlogn)):与边数有关&#xff0c;适合稀疏图&#…

severless 开发指南 q593393454

q593393454 q593393454 q593393454 q593393454 Serverless 架构应用开发指南 – serverless q593393454 code{white-space: pre-wrap;} span.smallcaps{font-variant: small-caps;} div.line-block{white-space: pre-line;} q593393454 div.column{display: inline-bl…