笔记98:按列压缩矩阵 csc_matrix 的 “含义”

news2025/9/18 22:49:52

1. 如何按列压缩矩阵:


注:按列压缩(Compressed Sparse Column -- CSC),是一种使用三个特征数组就可以表示整个矩阵的方法;

标准二次规划问题
  • x:状态量
  • P:矩阵
  • q:向量
  • A:矩阵
  • l:向量(x 的最小边界取值限制)
  • u:向量(x 的最大边界取值限制)

解释:一般我们在求解二次规划问题的时候,需要将矩阵 P 和 A 传入求解器;但如果我们通过一个个指定矩阵 P 和 A 的每个元素的方式定义矩阵,这样的代码可太脑瘫了;因此我们可以使用按列压缩的方式来表示一个矩阵,这样我们只需要3个特征数组,就可以知道整个矩阵到底是什么样的;需要完整的矩阵 A 和 P 时,将这3个特征数组传入函数 csc_matrix() 就可以了;


如何使用3个特征数组表示一个矩阵:

矩阵:A=\begin{bmatrix} 1 & 0 &4 \\ 0& 0 &5 \\ 2& 3 &6 \end{bmatrix}

定义特征数组:

  • A_data:从左到右按列遍历矩阵 A,记录每一列中每一个非零元素的值
    • A_data = [ 1 , 2 , 3 , 4 , 5 , 6 ]
  • A_indices:从左到右按列遍历矩阵 A,记录每一列上的非零数字的行索引值
    • A_indices = [ 0 , 2 , 2 , 0 , 1 , 2 ]
  • A_indptr:从左到右按列遍历矩阵 A,截止到当前列(不含当前列)时已遍历到的非零元素的个数
    • A_indptr = [ 0 , 2 , 3 , 6 ]
    • 解释:在数组 A_indptr 的索引为0处,代表当前列为第0列,不含当前列已遍历到的非零元素数量为0;
    • 解释:数组 A_indptr 的索引为3处,表示当前列为第3列,代表矩阵 A 的所有列(0~2)都已遍历,非零元素元素个数为6;

注1:通过这三个特征数组就可以得到矩阵 A 原本的模样;将矩阵 A 按列压缩,意思就是得到矩阵 A 的这三个特征数组;
注2:除了按列压缩,还有按行压缩等等各种压缩方法,基本原理一致,在此不再赘述;


a

a

a

a

2. 如何通过三个特征数组恢复矩阵


有特征数组:

  • A_data = [ 1 , 2 , 3 , 4 , 5 , 6 ]
  • A_indices = [ 0 , 2 , 2 , 0 , 1 , 2 ]
  • A_indptr = [ 0 , 2 , 3 , 6 ]

通过数组 A_indptr = [ 0 , 2 , 3 , 6 ] 可知:

  • 矩阵 A 有3列
  • 第零列 2 个非零元素;第一列 3-2=1 个非零元素;第二列 6-3=3 个非零元素;
  • 可以将 A_indices = [ 0 , 2 | 2 | 0 , 1 , 2 ] 分割为三段,一段代表一列;

通过数组 A_indices = [ 0 , 2 | 2 | 0 , 1 , 2 ] 可知,非零元素位置为:

  • 第0列:(0 , 0)  (2 , 0)
  • 第1列:(2 , 1)
  • 第2列:(0 , 2)  (1 , 2)  (2 , 2)

通过数组 A_data = [ 1 , 2 , 3 , 4 , 5 , 6 ] 给这些位置赋值即可得到矩阵 A;


a

a

a

a

3. 关于函数 csc_matrix


函数作用:通过传入的三个数组,恢复稀疏矩阵 A 原有的样子;

注1:这个函数是我们自己定义的;这个函数是没有C++版本的,只有Python版本,但是我们可以借助C++的 Eigen 库自己定义这个函数;

注2:我在使用 MPC 控制器控制车辆的运动时,建立了一个二次规划模型,需要使用 OSQP 库进行求解;

>>> indptr = np.array([0, 2, 3, 6])
>>> indices = np.array([0, 2, 2, 0, 1, 2])
>>> data = np.array([1, 2, 3, 4, 5, 6])
>>> csc_matrix((data, indices, indptr), shape=(3, 3)).toarray()
array([[1, 0, 4],
       [0, 0, 5],
       [2, 3, 6]])

参考文章:

  • csc_matrix稀疏矩阵理解_csc矩阵-CSDN博客
  • csc_matrix、coo_matrix - 简书
  • 稀疏矩阵csc_matrix函数的使用理解_osqp xishujuzhen-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11_从注意力机制到序列处理的革命:Transformer原理详解

1.1 简介 Transformer是一种深度学习模型,主要用于处理序列数据,尤其是自然语言处理任务,如机器翻译、文本摘要等。该模型由Vaswani等人在2017年的论文《Attention is All You Need》中首次提出,它的出现极大地推动了自然语言处理…

确定性网络_v0

目录 一、背景二、技术参考文献 一、背景 确定性网络(Deterministic Networking)是提供确定性服务质量的网络技术,是在以太网的基础上为多种业务提供端到端确定性服务质量保障的一种新技术。通过对网络数据转发行为的控制,将时延…

Ubuntu系统设置中文输入法

重新设置超级用户权限(root)密码(非必要) sudo passwd root 需要注意的是Ubuntu的root密码不能少于8个字符 设置成功后输入命令和新的密码即可无需输入sudo启用root命令 su - 更新软件包列表 sudo apt update sudo apt upgrade 安装fcitx5输入法框架 个别情况需要卸载旧的…

陪诊小程序开发,陪诊师在线接单

近几年,陪诊师成为了一个新兴行业,在科技时代中,陪诊小程序作为互联网下的产物,为陪诊市场带来了更多的便利。 当下生活压力大,老龄化逐渐严重,年轻人很难做到陪同家属看病。此外,就诊中出现了…

【Hive下篇: 一篇文章带你了解表的静态分区,动态分区! 分桶!Hive sql的内置函数!复杂数据类型!hive的简单查询语句!】

前言: 💞💞大家好,我是书生♡,本篇文章主要分享的是大数据开发中hive的相关技术。连接查询!正则表达式! 虚拟列!爆炸函数!行列转换! Hive的数据压缩和数据存储…

怎么提升机器人外呼的转化效率

在某些情况下,如市场调查、产品推广等,语音机器人可以高效地完成大量的呼叫任务,并能通过预设的语音脚本和智能识别功能,初步筛选和分类潜在客户。此时,不转人工可能更为高效和经济。 然而,在一些需要深度沟…

kettle从入门到精通 第六十九课 ETL之kettle kettle cdc mysql,轻松实现增量同步

1、之前kettle cdc mysql的时候使用的方案是canalkafkakettle,今天我们一起学习下使用kettle的插件Debezium直接cdc mysql。 注:CDC (Change Data Capture) 是一种技术,用于捕获和同步数据库中的更改。 1)Debezium步骤解析mysql b…

喜讯:NetMarvel 深度合作伙伴「点金石」斩获2024·MAMA 营销增长奖

全球市场瞬息万变,如何让增长做到有迹可循? 5月20日,由 AppsFlyer 举办的「2024 MAMA 移动互联网高层峰会」在三亚拉开序幕。在本届颁奖典礼上,NetMarvel 深度合作伙伴——点金石(GameGoing) 荣获「营销增长…

为什么要进行数据库设计?

本文介绍数据库设计的定义、知识要求和设计的内容。 01、数据库设计的定义和知识要求 数据库设计是指对于一个给定的应用环境,根据用户的需求,在某一具体的数据库管理系统上,构造一个性能良好的数据模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的信…

从 PERL 脚本获取输出并将其加载到 MySQL 数据库的解决方案

1、问题背景 有一段 Python 脚本可以调用 Perl 脚本来解析文件,解析后,Perl 脚本会生成一个输出,这个输出将被加载到 Python 脚本中的 MySQL 数据库中。Python 脚本如下: pipe subprocess.Popen(["perl", "./pa…

【方法】如何解除PDF“打开密码”?

很多人会给PDF文件设置密码保护,防止文件被随意打开。那如果后续想要解除“打开密码”,如何操作呢? 首先,我们要分两种情况来看,一种是知道密码的情况下,不需要保护文件了,也就是不想每次打开P…

Requests —— 请求头设置!

前戏 在我们进行自动化测试的时候,很多网站都会都请求头做个校验,比如验证 User-Agent,看是不是浏览器发送的请求,如果我们不加请求头,使用脚本访问,默认User-Agent是python,这样服务器如果进行…

警告:Hydration attribute mismatch on Note: this mismatch is check-only.(水合不匹配)

vue3Nuxt3运行代码是提示如下警告 [Vue warn]: Hydration attribute mismatch on <ul id​"sub_menu_5_$$_sub1-popup" class​"ant-menu ant-menu-sub ant-menu-inline" data-menu-list​"true" style​"display:​none;​">​…

Python网络爬虫5-实战网页爬取

1.需求背景 在上一篇Python网络爬虫4-实战爬取pdf中&#xff0c;以松下品牌说明书为例说明了网页爬取PDF的分析流程。在实际的应用中&#xff0c;具体代码需要根据不同的网址情况和需求进行更改。 明确要求&#xff1a; 此次&#xff0c;想要爬取苏泊尔品牌下的说明书pdf&…

学习ZYNQ——使用IP核

文章目录 [TOC](文章目录) 前言一、新建Vivado工程二、使用IP核1.加载IP2.查看IP核3.应用IP核 三、添加源文件1.led.v2.约束文件pin_led.xdc 四、综合、运行程序 前言 加载前面使用HLS生成的IP核&#xff0c;实现LED灯的闪烁&#xff0c;熟悉整套流程的步骤&#xff1a; 前一篇…

C++面向对象程序设计 - 命名空间

命名空间是ANSI C引入的可以由用户命名的作用域&#xff0c;用来处理程序中常见的同名冲突。 在C语言中定义了三个层次的作用域&#xff0c;即文件&#xff08;编译单元&#xff09;、函数和复合语句。C又引入了类作用域&#xff0c;类是出现在文件内的。在不同的作用域中可以定…

C# WPF入门学习主线篇(二十九)—— 绑定到对象和集合

C# WPF入门学习主线篇&#xff08;二十九&#xff09;—— 绑定到对象和集合 在WPF中&#xff0c;数据绑定是开发动态和交互性用户界面的核心技术。通过数据绑定&#xff0c;我们可以轻松地将UI控件与后台的数据源连接起来&#xff0c;实现数据的自动更新和显示。在本篇文章中&…

618有哪些值得入手的电子产品,个个都是心头爱!

今年的618购物节目已经开启&#xff01;你们期待的购物节就要到了&#xff0c;是不是已经跃跃欲试&#xff0c;准备开启购物模式了呢&#xff1f;别急&#xff0c;今天我就给大家带来了一份2024年618电子产品的好物清单&#xff0c;让你们购物不迷茫&#xff0c;轻松选到心仪的…

超声波清洗机对眼镜有伤害吗?四大超值不踩雷超声波清洗机安利

眼镜是现代人生活中的必备物品&#xff0c;但是很多人可能对于如何正确清洗眼镜感到困惑。传统的清洗方法可能会在清洗过程中对眼镜造成损坏&#xff0c;例如使用普通肥皂或清水清洗时容易划伤镜片。为了解决这个问题&#xff0c;家用眼镜超声波清洗机应运而生。超声波清洗机利…

逻辑斯谛回归与最大熵模型的原理实现

逻辑斯谛回归(LR)是经典的分类方法 1&#xff0e;逻辑斯谛回归模型是由以下条件概率分布表示的分类模型。逻辑斯谛回归模型可以用于二类或多类分类。 P ( Y k ∣ x ) exp ⁡ ( w k ⋅ x ) 1 ∑ k 1 K − 1 exp ⁡ ( w k ⋅ x ) , k 1 , 2 , ⋯ , K − 1 P(Yk | x)\frac{\…