稀疏矩阵的数据结构有很多种,每种数据结构都有它的优点,本文中列举了目前主流的稀疏结构并分析了其特点。稀疏矩阵的存储涉及到多种数据结构的设计与选择,目前流行的稀疏数据结构包括 COO(Coordinate)、CSR(Compressed Sparse Row)、CSC(Compressed Sparse Column)、LIL(Row-based List of Lists)、DIA(DIAgonal storage)、BSR(Block Sparse Row)、ELL(ELLPACK)等。COO 格式通过使用三个数组来分别表示非零元素的坐标和值,适用于具有任意分布的非零元素的稀疏矩阵;CSR 和 CSC 格式则分别以行和列为主导,使用压缩行和压缩列的方式存储非零元素,适合于以行或列为基础的操作,如矩阵向量乘法和 LU 分解;LIL 格式通过链表的方式按行存储非零元素,提供了灵活的插入和修改操作;DIA 格式则仅存储对角线元素和每个对角线的偏移量,实现了压缩存储;BSR 提供了良好的分块特性;ELL格式则将非零元素对齐存储在二维数组中,具有高效的空间和访问效率。
阅读全文Java Apache Collection4 工具箱使用笔记 置顶
本篇学习笔记将介绍 Apache Commons Collections 4 等使用。Collections 4 是一个非常有用的库,它提供了许多额外的集合类和工具方法来扩展Java标准库中的集合框架。Apache Commons Collections 4 提供了对 Java 标准集合框架的强大补充,包括新的集合类型、工具方法以及一些算法实现。
阅读全文CUDA 学习笔记 置顶
本篇学习笔记将从CUDA的编译开始,逐步深入到程序的运行与调试。同时,还将触及CUDA的底层机制,包括内存操作、线程管理,以及如何通过代码优化提升程序的执行效率。
阅读全文操作系统原理:C 语言 threads 多线程 实现单机聊天系统 置顶
这个实验会建立一个全双工系统(Full-Duplex),实现两个管道同时收发消息。在程序中会涉及到3个文件,2个管道,2个进程,4个线程。线程之间的拓扑图如下:
阅读全文YOLO 目标检测算法汇总 置顶
YOLO(You Only Look Once)是一系列目标检测算法,其核心思想是将目标检测视为回归问题,从而实现了端到端的训练。从最初的YOLOv1开始,该系列算法在速度和准确性方面不断取得突破。YOLOv1引入了单网络结构,实现了端到端的训练,虽然定位精度有待提高,但其高速性能为后续版本奠定了基础。YOLOv2(YOLO9000)通过引入批归一化、高分辨率分类器、锚点框等改进,显著提升了检测性能。YOLOv3则在保持高速的同时,通过多尺度预测、更好的基础分类网络和对象分类损失函数等优化,进一步提高了检测精度。而最新的YOLOv4和YOLOv5则在保持YOLO系列一贯的高速特性的同时,通过引入各种新的技巧和模块,如CSPNet、PANet、SiLU激活函数等,进一步提升了检测精度和速度。总体而言,YOLO系列算法以其高效、准确的特点,在目标检测领域持续引领创新,成为实际应用中的热门选择。
阅读全文Hexo 博客技能树 置顶
Hexo博客技能树汇总,在本篇文章中将会汇总本网站支持的各种功能,包括动态图表生成和 公式表示。
阅读全文H100 结构与 CUDA 编程
满配的 H100 有 8 个 GPC(图形处理集群,Graphics Processor Cluster),每个 GPC 有 9 个 TPC(纹理处理集群,Texture Processor Cluster),每个 TPC 内有 2 个 SM(Streaming MultiProcessor),总共有 144 个 SM。基于 SXM5(Server PCI Express Module) 的 H100 砍掉了 6 个 TPC,只有 66 个 TPC,总计 132 个 SM。
阅读全文在 Python 中调用 C++ 代码
Python与C++的互操作性为开发者提供了多种灵活的选择,在本篇文章中将会总结一些在Python中调用C++代码的方法,包括使用ctypes库直接调用C++动态链接库函数,借助SWIG或Boost.Python自动生成或手动编写接口,以及利用Cython和Pybind11等现代工具创建Python与C++之间的绑定。这些方法简化了在Python中调用C++代码的过程,使得开发者能够轻松利用C++的性能优势。本文将着重介绍 Pybind11 这一工具。
阅读全文STL 库中 SET 的原理
std::set
是C++标准库中的容器之一,它基于红黑树实现。std::set
利用红黑树的特性来实现有序的插入、查找和删除操作,并且具有较好的平均和最坏情况下的时间复杂度。
当向 std::set
插入元素时,它会按照特定的比较函数(bool less<T>::operator() const(const T &lhs, const T & rhs)
)将新元素插入到红黑树的适当位置,以保持树的有序性质。插入操作的平均时间复杂度为 ,其中是 std::set
中元素的数量。查找操作(find()
)使用红黑树的性质,通过比较函数在树中进行二分查找,查找操作的平均时间复杂度为 。