MATLAB系列07:稀疏矩阵、单元阵列和结构

MATLAB系列07:稀疏矩阵、单元阵列和结构

  • 7. 稀疏矩阵、单元阵列和结构
    • 7.1 稀疏矩阵
      • 7.1.1 sparse数据类型
        • 7.1.1.1 产生稀疏矩阵
        • 7.1.1.2 稀疏矩阵的运算
    • 7.2 单元阵列(cell array)
      • 7.2.1 创建单元阵列
        • 7.2.1.1 用赋值语句创建单元阵列
        • 7.2.1.2 用cell函数创建单元阵列
      • 7.2.2 单元创建者——大括号({})的应用
      • 7.2.3 查看单元阵列的内容
      • 7.2.4 对单元阵列进行拓展
      • 7.2.5 删除阵列中的元素
      • 7.2.6 单元阵列数据的应用
      • 7.2.7 字符串单元阵列
      • 7.2.8 单元阵列的重要性
      • 7.2.9 单元阵列函数总结
    • 7.3 结构数组
        • 7.3.1.1 用赋值语句创建函数
        • 7.3.1.2 用struct函数创建结构
      • 7.3.2 增加域到结构
      • 7.3.3 删除结构中的域
      • 7.3.4 函数getfield和函数setfield
      • 7.3.5 对结构体应用size函数
      • 7.3.6 结构的嵌套
      • 7.3.7 struct函数总结
    • 7.4 总结

7. 稀疏矩阵、单元阵列和结构

稀疏矩阵是矩阵的一种特殊形式,在这个矩阵中只对非零元素分配内存。单元阵列也是一种矩阵,它的每一个元素可以是 MATLAB 任何一种数据类型。它们广泛应用于 MATLAB 用户图象界面(GUI)函数。最后,结构提供了一种在单个变量中存储了不同类型的数据的方法,在这个变量中的每一个数据项目都有一个独立的名字。

7.1 稀疏矩阵

对大规模稀疏矩阵进行存储和运算(其中大部分为 0)是对内存空间和 cpu资源的极大浪费。不巧的是,在现实中的许多问题都需要稀疏矩阵,我们需要一些有效的方示来解决这个问题。

7.1.1 sparse数据类型

在 MATLAB 中有一个专门的数据类型,用来对稀疏进行运算。 sparse 数据类型不同于doulbe 数据,它在内存中只存储非零元素。实际上, sparse 数据类型只存储每一个非零元素的三个值:元素值,元素的行号和列号。尽管非零元素这三个值必须存储在这内存,但相对于存储稀疏矩阵的所有元素来说要简单高效得多。示例:

>> a=eye(10)a =1     0     0     0     0     0     0     0     0     00     1     0     0     0     0     0     0     0     00     0     1     0     0     0     0     0     0     00     0     0     1     0     0     0     0     0     00     0     0     0     1     0     0     0     0     00     0     0     0     0     1     0     0     0     00     0     0     0     0     0     1     0     0     00     0     0     0     0     0     0     1     0     00     0     0     0     0     0     0     0     1     00     0     0     0     0     0     0     0     0     1>> as=sparse(a)as =(1,1)        1(2,2)        1(3,3)        1(4,4)        1(5,5)        1(6,6)        1(7,7)        1(8,8)        1(9,9)        1(10,10)       1
7.1.1.1 产生稀疏矩阵

MATLAB 可以通过 sparse 函数把一个全矩阵转化为一个稀疏矩阵,也可以用 MATLAB 函数 speye, sprand 和 sprandn 直接产生稀疏矩阵,它们对应的全矩阵为 eye, rand, 和 randn。例如,表达式 a = speye(4)将产生一个 4×4 的稀疏矩阵。

>> a=speye(4)a =(1,1)        1(2,2)        1(3,3)        1(4,4)        1

表达式 b = full(a)把稀疏矩阵转化相应的全矩阵。

>> b=full(a)b =1     0     0     00     1     0     00     0     1     00     0     0     1
7.1.1.2 稀疏矩阵的运算

如果一个矩阵是稀疏的,那么单个元素可以通过简单的赋值语句添加或删除,例如下面的语句产生一个 4×4 的稀疏矩阵,然后把其他的非零元素加入其中。

>> a(2,1)=-2a =(1,1)        1(2,1)       -2(2,2)        1(3,3)        1(4,4)        1

MATLAB 允许全矩阵与稀疏的混合运算。它们产生的结果可以是全矩阵也可以是稀疏矩阵,这取决于那种结果更高效。更重要的是,任何的适用全矩阵算法同样地也适合稀疏矩阵。一些普通的稀疏矩阵函数如下:

image-20240914222510116

7.2 单元阵列(cell array)

image-20240914223033997

单元阵列是 MATLAB 中特殊一种数组,它的元素被称为单元(cells),它可以存储其它类型的 MATLAB 数组。一个单元阵列的每一个元素都是一个指针,指向其他的数据结构,而这些数据结构可以是不同的数据类型。单元阵列为选择问题信息提供极好的方示,因为所有信息都聚集在一起,并可以通边一单个名字访问。单元阵列用大括号{}替代小括号来选择和显示单元的内容。这个不同是由于单元的内容用数据结构代替了内容。假设一单元阵列如图 7.2 所示。元素 a(1, 1)是数据结构 3×3 的数字数组。 a(1, 1)的含义为显示这个单元的内容,它是一个数据结构。

>> a(1,1)
ans =
[3x3 double]

相对地, a{1, 1}的含义为显示这个数据结构的内容。

>> a{1,1}
ans =1 3 -72 0 60 5 1

7.2.1 创建单元阵列

7.2.1.1 用赋值语句创建单元阵列
>> a{1,1} = [1 3 -7; 2 0 6; 0 5 1];
a{1,2} = 'This is a text string.';
a{2,1} = [3+4*i -5; -10*i 3-4*i];
a{2,2} = [];
>> a(1,1) ={[1 3 -7; 2 0 6;0 5 1]};
a(1,2) = {'This is a text string.'};
a(2,1) = {[3+4*i -5; -10*i 3-4*i]};
a(2,2) = {[]};

编程隐患:

不要创建一个与已存在的数字数组重名的元阵列。如果得名了, MATLAB 会认为你把单元阵列的内容赋值给一个普通的数组,这将会产生一个错误信息。在创建单元阵列之前,确保同名的数字数字数组已经被删除。

7.2.1.2 用cell函数创建单元阵列

函数 cell 允许用户创建空单元阵列,并指定阵列的大小。例如,下面的语句创建一个 2 ×2 的空单元阵列。

a=cell(2,2)

7.2.2 单元创建者——大括号({})的应用

如果在单个大括号中列出所有单元的内容,那么就定义了许多的单元,在一行中的独立单元用逗号分开,行与行之间用分号隔开。例如下面的语句创建一个 2×3 单元阵列。

>> b = {[1 2], 17, [2;4]; 3-4*i, 'Hello', eye(3)}b =2×3 cell 数组{[             1 2]}    {[   17]}    {2×1 double}{[3.0000 - 4.0000i]}    {'Hello'}    {3×3 double}

7.2.3 查看单元阵列的内容

如果想知道单元阵列的所有内容,要用到celldisp函数

>> celldisp(b)b{1,1} =1     2b{2,1} =3.0000 - 4.0000ib{1,2} =17b{2,2} =Hellob{1,3} =24b{2,3} =1     0     00     1     00     0     1

如果要用高质量图像显示数据结构内容,要用到cellplot函数

>> cellplot(b)
image-20240915101637151

7.2.4 对单元阵列进行拓展

一个值赋值于一个单元阵列中的元素,如果这个元素现在不存在,那么这个元素就会被自动的建立,其他所需的元素也会被自动建立。

7.2.5 删除阵列中的元素

如果要删除单元阵列中的部分元素,我们把空值赋值于这一部分元素。

>> a(2,:)=[]a =1×2 cell 数组{3×3 double}    {'This is a text string.'}

7.2.6 单元阵列数据的应用

在一个单元阵列中,数据结构中数据可以随时用内容索引或单元索引调用。

>> c = {[1 2; 3 4],'dogs';'cats',i}c =2×2 cell 数组{2×2 double}    {'dogs'            }{'cats'    }    {[0.0000 + 1.0000i]}>> c{1,1}ans =1     23     4>> c{1,1}(1,2)ans =2

7.2.7 字符串单元阵列

在一个单元阵列中存储一批字符串与在标准的字符数组中存储相比是非常方便的,因为在单元阵列中每一个字符串的长度可以是不相同的,而在标准字符数组的每一行的长度都必须相等。这就意味着在单元阵列中的字符串没的必要增加多余的空格。

字符串单元阵列可以由两种方法创建。我们可以用方括号把独立的字符串插入到单元阵列,我们也可以函数 cellstr 把一个二维字符数组转化为相应的字符串单元阵列。

>> cellstring{1}='abc';
>> cellstring{2}='agb  fag';
>> cellstringcellstring =1×2 cell 数组{'abc'}    {'agb  fag'}
>> data=['Line   ';'6666999']data =2×7 char 数组'Line   ''6666999'>> c=cellstr(data)c =2×1 cell 数组{'Line'   }{'6666999'}

可以使用char函数进行逆转换

>> newdata=char(c)newdata =2×7 char 数组'Line   ''6666999'

7.2.8 单元阵列的重要性

单元阵列是非常灵活的,因为各种类型的大量数据可以存储在每一个单元中。所以,它经常当作中间 MATLAB 数据结构来用。单元阵列的灵活性可能使它们具有函数普通特性,这个函数是指带有输入参数和输出参数的变量个数的函数。一种特别的输入参数 varargin 可以在自定义函数中得到,这种函数支持输入参数的变量的个数。这个参数显在输入参数列表的最后一项,它返回一个单元阵列,所以一个输入实参可以包括任意数目的实参。每一个实参都变成了由 varagin 返回的单元阵列元素。如果它被应用, varagin 必须是函数中的最后一个输入参数。例如,假设我们要编写一个函数,它可能需要任意个数的输入参数。

function my_fun2(varargin)disp(['There are ' int2str(nargin) ' arguments.']);disp('The input arguments are:');disp(varargin)
end
>> my_fun2
There are 0 arguments.
The input arguments are:
>> my_fun2(6)
There are 1 arguments.
The input arguments are:{[6]}>> my_fun2(6,'test','hello')
There are 3 arguments.
The input arguments are:{[6]}    {'test'}    {'hello'}

7.2.9 单元阵列函数总结

image-20240915103642976

7.3 结构数组

一个结构也是一种数据类型,它的每一个元素都有一个名字。我们称结构中的元素为域。单个的域可以通过结构名和域名来访问,用句号隔开。

7.3.1.1 用赋值语句创建函数
>> student.name='Tom';
>> student.age='18';
>> student.city='Anytown';
>> studentstudent = 包含以下字段的 struct:name: 'Tom'age: '18'city: 'Anytown'

第二个 student 可以通过在结构名前加上一个下标的方式加入到这个结构中。

>> student(2).name='Lida'student = 包含以下字段的 1×2 struct 数组:nameagecity
>> student(1)ans = 包含以下字段的 struct:name: 'Tom'age: '18'city: 'Anytown'>> student(2)ans = 包含以下字段的 struct:name: 'Lida'age: []city: []
7.3.1.2 用struct函数创建结构
>> str_array=struct('key1',1,'key2','hello')str_array = 包含以下字段的 struct:key1: 1key2: 'hello'

7.3.2 增加域到结构

如果一个新的域名在结构数组中的任意一个元素中被创建,那么这个域将会增加到数组的所有元素中去。

7.3.3 删除结构中的域

>> str_array2=rmfield(str_array,'key1')str_array2 = 包含以下字段的 struct:key2: 'hello'

7.3.4 函数getfield和函数setfield

MATLAB 中有两个函数用来创建结构,这比用自定义函数创建要简单的多。函数 getfield得到当前存储在域中的值,函数 setfield

在域中插入一新值。getfield 函数的结构是

f = getfield(array,{array_index},'field',{field_index})

当编写程序时,尽管程序不知道结构数组中的域名,这个语句也可以应用。例如,假设我们需要编写一个程序,读取一未知数组并对它进行操作。函数可以通过调用 fieldnames 命令来确定一个结构数据的域名,然后通过函数 getfield 读取数据。为了读取第二个学生的name,函数为

>> student.name='Tom';
>> student.age='18';
>> student.city='Anytown';
>> student(2).name='Lida'student = 包含以下字段的 1×2 struct 数组:nameagecity>> name2=getfield(student,{2},'name')name2 ='Lida'

相似地,我们可以用 setfield 函数修改结构的值。

>> student=setfield(student,{2},'name','Jone')student = 包含以下字段的 1×2 struct 数组:nameagecity>> student(2)ans = 包含以下字段的 struct:name: 'Jone'age: []city: []

等价于:

>> student(2).name='Amy'student = 包含以下字段的 1×2 struct 数组:nameagecity>> student(2)ans = 包含以下字段的 struct:name: 'Amy'age: []city: []

7.3.5 对结构体应用size函数

当 size 函数应用于结构数组时,它将返回这个结构数组的大小。当 size 函数应用于结构数组中的一个元素的域时它将返回这个域的大小。例如

>> size(student)ans =1     2>> size(student(1).name)ans =1     3

7.3.6 结构的嵌套

结构数组的每一个域可是任意数据类型,包括单元阵列或结构数组。例如,下面的语句定义了一个新结构数组。它作为 student 的一个域,用来存储每一个学生所在班级的信息。

>> student(1).class(1).name='COSC 2021';
>> student(1).class(2).name='PHYS 1001';
>> student(1).class(1).instructor='Mr. Jones';
>> student(1).class(1).instructor='Mrs. Smith';
>> student(1)ans = 包含以下字段的 struct:name: 'Tom'age: '18'city: 'Anytown'class: [1×2 struct]>> student(1).classans = 包含以下字段的 1×2 struct 数组:nameinstructor>> student(1).class(1)ans = 包含以下字段的 struct:name: 'COSC 2021'instructor: 'Mrs. Smith'>> student(1).class(2).nameans ='PHYS 1001'

7.3.7 struct函数总结

image-20240916105451399

7.4 总结

image-20240916105615457 image-20240916105637878

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

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

相关文章

Day02Day03

1. 为什么拦截器不会去拦截/admin/login上,是因为在SpringMvc中清除了这种可能。 2.使用自己定义注解,实现AOP(insert ,update) 3.使用update最好使用动态语句,可以使用多次 4.使用阿里云的OSS存储。用common类 5.在写…

【BoF】《Bag of Freebies for Training Object Detection Neural Networks》

arXiv-2019 https://github.com/dmlc/gluon-cv 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Visually Coherent Image Mixup for Object Detection4.2 Classification Head Label Smoothing4.3 Data Preprocessing4.4 Traini…

[Redis][Redis简介]详细讲解

目录 1.认识 Redis2.Redis 特性1.速度快2.基于键值对的数据结构的服务器3.丰富的功能4.简单稳定5.客户端语言多6.高扩展性7.持久化(Persistence)8.主从复制9.⾼可⽤和分布式 3.Redis 使用场景1.数据库2.Cache3.消息队列 4.注意 1.认识 Redis Redis是⼀种基于键值对(Key-Value)…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析,发现了一些规律: 1)固定的类名令牌为模型的优化提供了强正则化,减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…

ARM总复习

1.计算机的组成 输入设备 输出设备 存储设备 运算器 控制器、总线 2.指令和指令集 2.1 机器指令 机器指令又叫机器码,在运算器内部存在各种运算电路,当处理器从内存中获取一条机器指令,就可以按照指令让运算器内部的指定的运算电路进行运…

百度智能云SSL证书安装指南

第一步:准备SSL证书 在华测ctimall(https://www.ctimall.com/ssl)申请SSL证书后,您会收到一个包含多种证书格式的压缩文件。请解压此文件,并找到Nginx目录中的证书文件,因为这是百度智能云中需要用到的证书…

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日,2024年中国国际服务贸易交易会(服贸会)示范案例交流会暨颁奖典礼在北京国家会议中心举行,九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

pc端的屏保实现

背景 偶然间,在使用一款google插件的时候,发现它有一个小功能,只要我停留在它的页面不操作10分钟以上,就会自动给我打开一个屏保界面,这样的 目的 这种华而不实的功能,正好适合个人博客,所以…

Prometheus监控k8s环境构建

传统架构中比较流行的监控工具有 Zabbix、Nagios 等,这些监控工具对于 Kubernetes 这类云平台的监控不是很友好,特别是当 Kubernetes 集群中有了成千上万的容器后更是如此,本章节学习下一代的云原生监控平台---Prometheus。 一、基于kuberne…

医学数据分析实训 项目七 集成学习--空气质量指标--天气质量分析和预测

项目七:集成学习 实践目的 理解集成学习算法原理;熟悉并掌握常用集成学习算法的使用方法;熟悉模型性能评估的方法;掌握模型优化的方法。 实践平台 操作系统:Windows7及以上Python版本:3.8.x及以上集成开…

LineageOS连接网络提示IP配置失败

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ IP配置失败 连接所有网络都提示IP配置失败,通过配置静态IP也连不上网络,感觉就是WIFI模块不能用了。 使用 Magisk root 后就这样了&am…

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…

spring security 手机号 短信验证码认证、验证码认证 替换默认的用户名密码认证132

spring security内置的有用户名密码认证规则,还可以调用第三方微信、qq登录接口实现登录认证,这里使用自定义的手机号和短信验证码实现登录认证。 要实现自定义的手机号和短信验证码认证需要了解用户名密码认证的逻辑,仿照该逻辑就可以写出…

Java进阶之集合框架(Set)

【基本内容】 二、Set接口(接上一章) Set是Java集合框架中不允许有重复元素的无序集合,其典型的实现类是HashSet,它完全是遵循Set接口特性规范实现的,无序且不允许元素重复;而Set接口下的实现类还有LinkedHashSet和TreeSort&#…

记录生产环境,通过域名访问的图片展示不全,通过ip+端口的方式访问图片是完整的

原因:部署nginx的服务器硬盘满了 排查发现nginx日志文件占用了大量硬盘 解决方案: 删除该文件,重启nginx服务,问题解决。

AI修手有救了?在comfyui中使用Flux模型实现局部重绘案例

🐱‍🐉背景 局部重绘相关的话题我们已经讨论和测试过很多次了,比如说inpaint模型、brushnet模型、powerpaint模型等等,最近对于flux模型重绘画面的案例也越来越多了,那我们就结合flux模型的重绘来试试看效果。 &…

前端mock了所有……

目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提: 事情是这样的,老板想要我们写一个demo拿去路演/拉项目,有一些数据,希望前端接一下,写几个表格&a…

qt信号与槽(自定义)

自定义信号与槽 在qt里,我们可以自己去定义信号与槽。 这里举个栗子: 信号的定义 在我们类里边定义一个信号,我们需要用signals:来声明,不用再去cpp文件里边定义。而且返回值必须是void,可以有参数。 槽…

2024年最新测绘地理信息规范在线查看下载

随着科技的飞速发展,测绘地理信息行业也迎来了新的机遇与挑战。 为了确保测绘地理信息的准确性和规范性,每年都会出台了一系列最新的测绘地理信息规范。 本文将历年地形行业发布的相关标准规范,包括现行和一些已经弃用的标准,截…