sprs是用纯Rust实现的部分稀疏矩阵数据结构和线性代数算法

特性

结构

  • 矩阵

  • 三元组矩阵

  • 稀疏向量

运算

  • 稀疏矩阵 / 稀疏向量积

  • 稀疏矩阵 / 稀疏矩阵积

  • 稀疏矩阵 / 稀疏矩阵加法,减法

  • 稀疏向量 / 稀疏向量加法,减法,点积

  • 稀疏 / 稠密矩阵运算

算法

  • 压缩稀疏矩阵的外部迭代器

  • 稀疏向量迭代

  • 稀疏向量联合非零迭代

  • 简单的稀疏矩阵Cholesky分解 (需要选择接受 LGPL 许可)

  • 等式右侧为稠密矩阵或向量情况下的稀疏矩阵解三角方程组

示例

矩阵创建

use sprs::TriMat;let mut a = TriMat::new((4, 4));
a.add_triplet(0, 0, 3.0_f64);
a.add_triplet(1, 2, 2.0);
a.add_triplet(3, 0, -2.0);// 这个矩阵类型不允许进行计算,需要
// 转换为兼容的稀疏矩阵类型,例如
let b = a.to_csr();

用更高效直接的稀疏矩阵生成器来构建矩阵

  use sprs::{CsMat, CsMatOwned, CsVec};let eye : CsMatOwned<f64> = CsMat::eye(3);let a = CsMat::new_csc((3, 3),vec![0, 2, 4, 5],vec![0, 1, 0, 2, 2],vec![1., 2., 3., 4., 5.]);

矩阵向量乘法

  use sprs::{CsMat, CsVec};let eye = CsMat::eye(5);let x = CsVec::new(5, vec![0, 2, 4], vec![1., 2., 3.]);let y = &eye * &x;assert_eq!(x, y);

矩阵乘法,加法

  use sprs::{CsMat, CsVec};let eye = CsMat::eye(3);let a = CsMat::new_csc((3, 3),vec![0, 2, 4, 5],vec![0, 1, 0, 2, 2],vec![1., 2., 3., 4., 5.]);let b = &eye * &a;assert_eq!(a, b.to_csr());

其他示例

pub mod array_backend;
pub mod errors;
pub mod indexing;
pub mod io;
pub mod num_kinds;
mod sparse;
pub mod stack;pub type Ix1 = ndarray::Ix1;
pub type Ix2 = ndarray::Ix2;pub use crate::indexing::SpIndex;pub use crate::sparse::{csmat::CsIter, csmat::OuterIterator, csmat::OuterIteratorMut,csmat::OuterIteratorPerm, kronecker::kronecker_product, CsMat, CsMatBase,CsMatI, CsMatVecView, CsMatView, CsMatViewI, CsMatViewMut, CsMatViewMutI,CsStructure, CsStructureI, CsStructureView, CsStructureViewI, CsVec,CsVecBase, CsVecI, CsVecView, CsVecViewI, CsVecViewMut, CsVecViewMutI,SparseMat, TriMat, TriMatBase, TriMatI, TriMatIter, TriMatView,TriMatViewI, TriMatViewMut, TriMatViewMutI,
};pub use crate::sparse::symmetric::is_symmetric;pub use crate::sparse::permutation::{perm_is_valid, transform_mat_papt, PermOwned, PermOwnedI, PermView,PermViewI, Permutation,
};pub use crate::sparse::CompressedStorage::{self, CSC, CSR};pub use crate::sparse::binop;
pub use crate::sparse::linalg;
pub use crate::sparse::prod;
pub use crate::sparse::smmp;
pub use crate::sparse::special_mats;
pub use crate::sparse::visu;pub mod vec {pub use crate::sparse::{CsVec, CsVecBase, CsVecView, CsVecViewMut};pub use crate::sparse::vec::{IntoSparseVecIter, NnzEither, NnzIndex, NnzOrZip, SparseIterTools,VecDim, VectorIterator, VectorIteratorMut,};
}pub use crate::sparse::construct::{bmat, hstack, vstack};pub use crate::sparse::to_dense::assign_to_dense;/// 矩阵的形状,第一个元素表明这是一个双元素元组
/// 行数, 第二个元素表明列数
pub type Shape = (usize, usize); // FIXME: 或许此处可以用Ix2?pub type SpRes<T> = Result<T, errors::SprsError>;/// 用枚举作为配置项来对算法进行对称性检查
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum SymmetryCheck {CheckSymmetry,DontCheckSymmetry,
}
pub use SymmetryCheck::*;/// 用枚举作为配置项来对算法进行排列检查
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub enum PermutationCheck {CheckPerm,DontCheckPerm,
}
pub use PermutationCheck::*;/// sprs支持的不同种类的填充归约算法
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
#[non_exhaustive]
pub enum FillInReduction {NoReduction,ReverseCuthillMcKee,CAMDSuiteSparse,
}#[cfg(feature = "approx")]
/// 用于比较向量和矩阵的特征使用了近似特征
///
/// 使用不同的存储来比较稀疏矩阵可能会很慢
/// 为了高效,建议使用同样的存储顺序
///
/// 这些特征需要 `approx` 特性在激活状态
pub mod approx {pub use approx::{AbsDiffEq, RelativeEq, UlpsEq};
}#[cfg(test)]
mod test_data;#[cfg(test)]
mod test {use super::CsMat;#[test]fn iter_rbr() {let mat = CsMat::new((3, 3),vec![0, 2, 3, 3],vec![1, 2, 0],vec![0.1, 0.2, 0.3],);let view = mat.view();let mut iter = view.iter();assert_eq!(iter.next(), Some((&0.1, (0, 1))));assert_eq!(iter.next(), Some((&0.2, (0, 2))));assert_eq!(iter.next(), Some((&0.3, (1, 0))));assert_eq!(iter.next(), None);}
}

【每周一库】- sprs - 用Rust实现的稀疏矩阵库相关推荐

  1. golang byte转string_Golang和Rust语言常见功能/库

    时下最流行.最具发展前途的的两门语言是Golang和Rust.Golang语言简洁.高效.并发.并且有个强大的囊括了常见功能标准库.与之相对比,Rust语言则主要是安全.高性能.虽然Rust没有gol ...

  2. java 释放指针_C库释放来自Rust的指针

    我想对需要回调的C库执行Rust绑定,并且此回调必须返回一个C风格的 char* 指向C库的指针,然后释放它 . 回调必须在某种意义上暴露给我的库的用户(可能使用闭包),并且我想尽可能方便地提供Rus ...

  3. Rust轻量级I/O库mio

    Rust轻量级I/O库mio mio是rust实现的一个轻量级的I/O库.其实现基本上就是对不同操作系统底层相关API的封装,抽象出统一的接口供上层使用.Linux下为epoll,Windows下为I ...

  4. Datenlord | Rust实现RDMA异步编程(二):async Rust 封装 UCX 通信库

    UCX 是一个高性能网络通信库,它作为 MPI 所依赖的通信模块之一在高性能计算领域得到广泛的使用.UCX 使用 C 语言编写,为了在 Rust 项目中使用它,我们需要将它的 C 接口包装成 Rust ...

  5. 【一起学Rust | 进阶篇 | thesaurus-rs库】Rust 的离线同义词库——thesaurus-rs

    文章目录 前言 后端比较 一.安装与引用 1. 使用WordNet后端 2. 使用moby后端 3. build下载crate 二.使用步骤 1.获取命令行参数 2.取到同义词 补充 3.输出结果 4 ...

  6. GCC 连接器、链接标准库 gcc -l、链接手动创建库(指定目录的库 gcc -L)

    1. 链接器 链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件. 在链接过程中,它必须把符号(变量名.函数名等一些列标识符)用对应的数据的内存地址(变量地址.函数地址等 ...

  7. oracle主备库sync模式,Oracle 探索DG备库undo工作模式

    模拟备库出现 ORA-01555 分析备库 undo 工作模式 一: 修改主库 备库 undo 表空间 1.在主库创建undo表空间(会自动同步到备库) SYS@prod>create undo ...

  8. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  9. iOS架构-C/C++lame库在Mac下编译通用静态库.a库(13)

    C/C++ 有很多成熟的库,还有很多特殊功能的库,有时候iOS 平台开发一些比较前沿或者冷门的功能时,iOS并没有提供解决方案,这时候就可以研究C/C++的一些库,为我们使用.但是在Xcode编译C/ ...

最新文章

  1. 一种基于FPGA硬件求解对数的简化方法
  2. P1991 无线通讯网
  3. Activity与AppCompatActivity全屏实现方法
  4. 期权“不公平”是认识上的错误
  5. java service 初始化_【Java】Nacos – NacosNamingService初始化
  6. alter 弹出添加图片_解决PS保存JPG图片内存很大的方法(二)
  7. logistic人口模型python代码_人口模型(马尔萨斯vslogistic).ppt
  8. axios 封装数据请求
  9. LaTex学习笔记——中文排版
  10. Daedalus Icarus
  11. Ubuntu 下安装VirtualBox主要步骤及出现的问题的解决方案
  12. android studio连接雷电模拟器
  13. 实现php Curl 调用不同项目中方法
  14. 从HTTP状态 301,302,200 来看页面跳转
  15. 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...
  16. airflow连接mysql错误_airflow使用MySQL数据库(第三方数据库详解)
  17. 希尔伯特黄变换matlab,HHT变换的三种方法 Matla
  18. vue踩坑笔记06---vuex的state,getter,mustation,action,module
  19. 零基础选择IT培训靠谱吗 能否找到工作
  20. mysql 外键查询_mysql 外键查询(mysql数据库多表联查)

热门文章

  1. 第六章 伊拉斯蒂克
  2. c语言实验报告大气,室内环境舒适度评价分析实验报告
  3. MySQL 数据库定时备份的几种方式(非常全面)
  4. 亚马逊测评的评论为什么老被删?
  5. 每日新闻丨我国完成太阳帆在轨关键技术验证;美银看好微软云计算领域增长...
  6. VSCode不能拖动导入文件的解决方法
  7. 雷军发全员信祝贺,小米手机销量超过苹果,晋升全球第二!
  8. URP管线中自定义Bloom
  9. 2006我的迷信算命总结
  10. 用商务领航行的webservice发送短信