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

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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Blender:渲染输出

渲染输出界面 渲染设置界面: 输出设置界面: 输出文件格式 【文档】 视频导出格式: AVI JPEG 使用JPEG压缩的AVI。有损,能得到更小的文件,但大小无法与编解码器的压缩算法得到的文件相比。JPEG 压缩也是数字摄像机使用…

使用asyncua模块如何在opcua框架的Server端添加方法及在Client端调用方法

1. 在opcua框架的Server端添加方法 参考文章: freeopcua调用方法输入参数| Python解析数组到输入列表 为OPC UA python服务器/客户端添加安全性(异步) OPCUA和asyncua — [3] 添加方法 OPC UA的Server端新增方法的关键代码如下:…

英语学习笔记35——Our village

Our village 我们的村庄 词汇 Vocabulary photograph n. 照片 通常说:photo 复数:photos     picture 复数:pictures 搭配:take a photo 照相 以o结尾的单词复数es的: potato —— potatoes tomato —— tomatoe…

Cancer Cell | 樊嘉院士/张力烨团队解析转移性肝细胞癌的时空演变

肝细胞癌(Hepatocellular Carcinoma,HCC)作为全球癌症死亡率的第三大原因,对人类健康构成了严重威胁,尤其是HCC发展到转移阶段,治疗选择变得有限,患者预后通常较差。尽管近年来在HCC的研究取得了…

电脑屏幕监控软件有哪些?2025年监控软件排行榜

电脑屏幕监控软件有哪些?2025年监控软件排行榜 虽然现在还是2024年,但是有一些被广泛讨论和推荐的电脑屏幕监控软件,它们将在2025年异军突起,成为行业的引领者。 1.安企神软件: 功能全面的电脑屏幕监控软件&#xf…

有监督学习——梯度下降

1. 梯度下降 梯度下降(Gradient Descent)是计算机计算能力有限的条件下启用的逐步逼近、迭代求解方法,在理论上不保证下降求得最优解。 e.g. 假设有三维曲面表达函数空间,长(x)、宽(y)轴为子变量,高(z)是因变量&…

机器学习笔记 - LoRA:大型语言模型的低秩适应

一、简述 1、模型微调 随着大型语言模型 (LLM) 的规模增加到数千亿,对这些模型进行微调成为一项挑战。传统上,要微调模型,我们需要更新所有模型参数。这也称为完全微调 (FFT) 。下图详细概述了此方法的工作原理。 完全微调FFT 的计算成本和资源需求很大,因为更新每…

基于软件在环的飞控机建模仿真

安全关键系统(Safety-Critical System,SCS)是指由于某些行为或组合行为能够引发整体系统失效,继而导致财物损失、人员受伤等严重影响的系统,诸多安全关键领域如航空航天、核电系统、医疗设备、交通运输等领域的系统都属…

ansible安装wordpress

1.回顾 yum安装wordpress 查看别名 [rootlocalhost ~]# type ll ll 是 ls -l --colorauto 的别名设置别名 aliasyum install -y alias ymyum install -y# 使用别名 ym nginx# 取消别名 unalias ym# 基于LNMP做一个wordpressnginx mysql 5.7 PHP 7.4#1、初始化过程 修改主机名…

mathematical-expression-cpp | C++ 数学表达式解析库

数学表达式-cpp Switch to English Document 介绍 本框架是一种针对数学公式解析的有效工具,能够通过C的API解析包含嵌套函数,包含函数,数列步长累加等数学公式,返回值是一个数值的结果对象,同时也可以进行比较运算…

Python学习从0开始——Kaggle深度学习002

Python学习从0开始——Kaggle深度学习002 一、单个神经元1.深度学习2.线性单元示例 - 线性单元作为模型多个输入 3.Keras中的线性单元 二、深度神经网络1.层多种类型的层 2.激活函数3.堆叠密集层4.构建Sequential模型 三、随机梯度下降1.介绍2.损失函数3.梯度下降法1.梯度下降法…

只登录不发微博ip地址会变吗?探索其中的奥秘

在数字化时代,网络IP地址如同我们的数字身份证,记录着我们在网络世界中的每一次活动。对于微博这一社交平台的用户而言,IP地址的变动或许是他们未曾注意过的细节。那么,当用户仅登录微博而不发微博时,其IP地址是否会发…

仰望U8三大黑科技,重新定义智能汽车

文 | 智能相对论 作者 | 雷歌 是时候重新定义中国的“智能汽车”了。 在仰望U8出来以前,普通人对知道的智能汽车的配置认识,智能汽车是智能驾驶智能座舱,硬件上大概是这几样:毫米波雷达激光雷达智驾芯片。 仰望U8出来以后&…

Spring Boot集成 Spring Retry 实现容错重试机制并附源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

LDO重要参数 – 芯片热阻

原文出自微信公众号【小小的电子之路】 最近画了一块电路板,板子上的芯片采用LDO供电,测试过程中发现LDO发热极其严重,最终不得不重新画板,加入散热设计。提到芯片发热,不得不说的一个参数就是芯片热阻,LDO…

PyTorch -- Visdom 快速实践

安装:pip install visdom 注:如果安装后启动报错可能是 visdom 版本选择问题 启动:python -m visdom.server 之后打开出现的链接 http://localhost:8097Checking for scripts. Its Alive! INFO:root:Application Started INFO:root:Working…

安装前端依赖node-sass报错

文章目录 问题1:node-sass报错问题2:node-gyp报错问题3:node-sass再次报错问题4:node-sass三次报错 问题1:node-sass报错 问题描述:经常会碰到一个新的项目安装依赖时,会报node-sass版本的问题…

寄件管理系统操作教程

步入信息化时代,企业之间的经济活动开始向线上转移,对公邮寄的管理问题,也开始进入管理者的视线内。为什么这么说呢? 很简单,早前想要谈妥一单生意,需要会面拜访等等线下活动,随着互联网的发展&…

你好,Jetpack Compose

文章目录 为什么选 Jetpack Compose先决条件新建项目新建虚拟设备运行项目 为什么选 Jetpack Compose Jetpack Compose 是 Android 开发最新的、现代化的 UI 框架开发者几乎只需要使用 Kotlin 一门语言即可完成 App 开发(Java 是基础,有些源码是 Java 写…

无线MODBUS通讯模块在供水系统中的应用

一、项目背景 我国是人口大国、农业大国,同时也是贫水大国。由于大量工业废水污染了部分河流、地表的浅层水资源,并且有逐年加重的趋势,再加上农业、绿化等灌溉对水资源的大量消耗,这些因素综合作用进一步加剧了我国水资源紧缺的…