文档总目录

本文目录

  • 稀疏矩阵初始化
    • 构造
    • 重置大小/预分配内存空间
    • 赋值
    • 逐元素插入
    • 批量插入
    • 指定位置或随机插入
  • 矩阵属性
  • 算术运算
    • 加减
    • 标量积
    • 稀疏矩阵乘积
    • 转置/伴随
    • 排列
    • 组件级操作
  • 其他支持的操作
    • 子矩阵
    • 范围操作
    • 三角形和自伴随视图
    • 三角形求解
    • 低级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 对象。

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

  1. SpringBoot中文文档 SpringBoot中文参考指南 SpringBoot中文参考文档 springboot中文文档 springboot中文

    SpringBoot中文文档 SpringBoot中文参考指南 SpringBoot中文参考文档 springboot中文文档 springboot中文 SpringBoot中文文档 SpringBo ...

  2. [Eigen中文文档] 矩阵与向量运算

    专栏总目录 本文目录 介绍 加法与减法 标量的标量乘法与除法 表达式模板 转置与共轭 (矩阵与矩阵)和(矩阵与向量)的乘积 点积和叉积 基本算术的简化运算 操作的有效性 英文原文(Matrix and ...

  3. PyTorch 1.0 中文文档:torchvision 参考

    译者:BXuan694 torchvision 包收录了若干重要的公开数据集.网络模型和计算机视觉中的常用图像变换 包参考 torchvision.datasets MNIST Fashion-MNI ...

  4. 【kivy自学笔记】快速入手kivy(Kivy 安装及使用教程),含中文文档,使用参考文章!

    文章目录 安装kivy 使用 打包 Ubuntu上安装buildozer 如何使用 buildozer 将 Python转成APK? 设置buildozer默认启动参数 buildozer.spec解 ...

  5. [Eigen中文文档] 归约、访问者和广播

    专栏总目录 本文目录 归约 范数计算 布尔归约 用户自定义的归约 访问者函数 局部归约 将局部归约与其他操作结合 广播 将广播与其他操作结合 英文原文(Reductions, visitors and ...

  6. dash html中文文档,Dash Docset 创建指南

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Dash 是 Macos 上一款热门的API查询工具,可以用来查询很多常用语言/框架的官方文档.Windows 平台有类 ...

  7. [Eigen中文文档] 按值将Eigen对象传递给函数

    文档总目录 本文目录 按值传递和按引用传递 Eigen的处理 英文原文(Passing Eigen objects by value to functions) 按值传递和按引用传递 按值传递:传入函 ...

  8. Airflow 中文文档:API 参考

    运营商 运算符允许生成某些类型的任务,这些任务在实例化时成为DAG中的节点. 所有运算符都派生自BaseOperator ,并以这种方式继承许多属性和方法. 有关更多详细信息,请参阅BaseOpera ...

  9. [Eigen中文文档] 切片和索引

    专栏总目录 本文目录 概述 基本的切片 编译时的大小和步长 倒序 索引序列 自定义索引列表 英文原文(Slicing and Indexing) 本文介绍了如何使用操作运算符operator()索引行 ...

最新文章

  1. mysql 表分区 django_MySQL partition分区I
  2. [LeetCode] Wildcard Matching 题解
  3. 机器学习-逻辑回归-代价函数
  4. 【PAT】A1053 Path of Equal Weight
  5. 生物信息学搞计算机,生物信息学前景展望,谈谈感想(已经停止)
  6. es6笔记 day3---Promise
  7. leetcode 加一
  8. 谁与争锋-七款杀毒软件比较分析
  9. JAVA动态加载JAR包执行程序
  10. 直关的sql 联级更新语句
  11. 用Mediator Pattern + Queue 解决 订单处理流程
  12. 原创:微信小程序调用【统一下单】、【支付】、【支付回调】api并处理请求...
  13. python图像物体的自动标注_python中matplotlib实现随鼠标滑动自动标注代码实例
  14. 解密常见的社会工程学攻击
  15. Linux常用软件包(常用命令)
  16. 微信小程序图片上传一直loading中,上传没反应
  17. Win10 System进程占用硬盘100%,Microsoft IME 占用CPU高
  18. 华为云计算HCIE学习总结-云计算主流技术
  19. 玩转树莓派二、树莓派配置工具 raspi-config 使用指南
  20. 你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?

热门文章

  1. 第一部分 HTTP:Web的基础——第2章 URL与资源
  2. 2023年湖北报考施工员要多少钱?甘建二告诉您
  3. Scratch猜数字游戏 电子学会图形化编程scratch等级考试三级真题答案2020-5
  4. 教程 | 各省电力缺口有多大,看看这张电力大数据地图
  5. SQL 判断字段值是否有中文、英文、数字、提取中文、英文、数字
  6. cosmos源码分析——staking模块(节点管理)
  7. CSDN基础命令以及思科华为命令区别
  8. Lucene代码分析10
  9. CPU : 什么是超频,怎么给CPU超频?
  10. Java输出1000以内的完数(完数是恰好等于它的因子之和)