028_Comma_Separated_List_in_Matlab中的逗号分割列表

在这里插入图片描述

什么是逗号分割列表

这玩意一般都不知道是什么,Comma-separated list,CSL, 虽然,用Matlab的时候天天会用到。这到底是个什么玩意?或者,更进一步,这到底是不是个玩意?

每次调用一个参数大于一个的函数时,我们就是用了一个CSL,a.k.a.,逗号分割列表。

>> zeros(2, 2)ans =0     00     0

每次我们显式定义一个数组/矩阵/元胞数组时,我们就写了一个或者多个逗号分割列表。

>> [1, 2, 3, 3; 4, 5, 6, 7]ans =1     2     3     34     5     6     7>> {1,2,3}ans =1×3 cell 数组{[1]}    {[2]}    {[3]}

我们还可以在命令行下面直接这样写:

>> 1,2, '53', "23"ans =1ans =2ans ='53'ans = "23"

这样观察下来,从字面上,我们可以知道,逗号分割列表的定义就是,字面上的,用逗号分开的多个值,这些值不需要是一样的类型。

那么,这个玩意有什么用呢?在考察有什么用之前,我们先考察一下,从哪儿能变出逗号分割列表。

逗号分割列表与其他数据结构的关系

我们重点考虑结构数组、元胞数组和字符数组与逗号分割列表的关系。

结构数组

我们最常用到的结构数组就是对目录下的文件进行处理的时候,通常我们会用dir函数配合通配符*来得到目录下文件/子目录的列表。

>> s = dir(".")s = 包含以下字段的 18×1 struct 数组:namefolderdatebytesisdirdatenum

这个时候,我们就会得到一个结构数组,这里,是一个18x1的数组,数组的每个元素就是一个包含六个field字段的结构体。

这个时候,我们采用索引的语法来访问,就会得到逗号分割列表。

s.name

就得到所有名字构成的逗号分割列表。就相当于运行:

s(1).name, s(2).name, s(3).name, ..., s(end).name

同样,还能够用所有的索引访问语法来获得部分元素的相应字段的逗号分割列表。就比如说,我们要获得所有的非目录文件名:

idx = [s.isdir];
s(~idx).name

这也可以直接写成

s(~[s.isdir]).name

值得注意的是,这里,用了两次结构数组字段访问的语法,得到相应的逗号分割数组。

这里还有一个特殊的语法需要注意,[s.isdir],这里有一个原则:

逗号分割列表等效约定:每次有一个值是CSL,逗号分割列表时,就等效与把对应的展开形式直接写在这里。

那么,这里就相当于是:

[s(1).isdir, s(2).isdir, ..., s(end).isdir]

是一个最为平凡的数组定义语句。

这里有一个思考题,我们知道前面得到的s的字段name是一个字符数组,也就是'dir.m'这样的特殊数组,

  1. [s.name]会是什么?
  2. {s.name}会是什么?

元胞数组

思考题的第一问很简单,我们的字符数组,是一个行向量,其实,['dir.m']等效是['d', 'i', 'r', '.', 'm'],那么[s.name]就会形成一个所有的名字拼在一起的字符数组。

思考题的第二道,应用上面的等效约定,这就是元胞数组的构造。

那么{s.name}就等效于{s(1).name, s(2).name, ..., s(end).name},构成一个一行的元胞数组。

相应的,对元胞数组进行{}索引,也得到符号分割列表。

>> cs = {1, 2; 3, 4}cs =2×2 cell 数组{[1]}    {[2]}{[3]}    {[4]}>> cs{:}ans =1ans =3ans =2ans =4

同样, {}也支持多种索引访问语法形式cs{idx},同样,也会得到相应个数的逗号分割列表。

逗号分割列表等效原则对这里依然适用,所以,下面两个表达式字面上等效,可以相互替换。

  1. A{:}
  2. A{1}, A{2}, A{3}, ..., A{end}

字符数组和字符串数组

自从R2016b 中的 MATLAB 中引入string之后,文本的表达方式就有两种:

  1. 字符数组
  2. 字符串

字符数组是一个字符的行向量,表达一行文本,所以利用[]来定义更长数组的语法天然就是合法的,因此,字符串连接也可以用逗号分割列表天然的完成(逗号可以省略)。

>> 'abc'ans ='abc'>> ['abc', 'cde']ans ='abccde'

所以,如果要表达一个字符串数组的数组时,如果构造一个二维字符串数组,则自动提出了所有行都相等的限制……那么要表达多个长度不一样的字符串的数组怎么办呢?

在R2016b以前,只能采用字符数组的元胞数组来完成,也就是:


>> {'abc', 'efg'}ans =1×2 cell 数组{'abc'}    {'efg'}>> {'abc', 'efg'; 'a', 'b'}ans =2×2 cell 数组{'abc'}    {'efg'}{'a'  }    {'b'  }

还是挺不自然的。

因此就有了字符串,则跟其他程序设计语言中的字符串一样,用双引号,是一个正经的对象。

从这以后,能够有一种叫字符串数组的东西:

>> strs = ["abc", "d", "efghi"]strs = 1×3 string 数组"abc"    "d"    "efghi"

这个东西,跟{"abc", "d", "efghi"}在功能上就有点类似。

所以,对这个数组进行索引,可以采用{idx}的语法,这里面idx也是一切合法的索引访问语法,包括{:},那么,得到的是什么呢?居然是字符数组的逗号分割列表……

>> strs{:}ans ='abc'ans ='d'ans ='efghi'

好吧,最终还是闭环了……

逗号分割列表的作用

这个逗号分割列表跟Common Lisp中的values一样,主要用于处理函数的输入和输出。

函数输入

通过逗号分割列表等效,我们就能够动态构造函数的输入变量。构造一个比输入数组倍数大小的数组:

function B = matrixBigger(A, n)
sz = arrayfun(@(szi) n * szi, size(A), 'UniformOutput', false);
B = zeros(sz{:});
end

对于那些参数可变的函数,更有特别的效果:

>> C = {1, 0, Inf, rand(10,1)}C =1×4 cell 数组{[1]}    {[0]}    {[Inf]}    {10×1 double}>> vertcat(C{:})ans =1.00000Inf0.78160.39390.45780.55190.66990.78610.40830.69450.28090.1369

根据逗号分割列表等效原则,这就等于是vertcat([1], [0], [Inf], rand(10, 1))

函数输出

函数输出也同样可以应用逗号分割列表等效原则,[a, b, c] = func(e, d, f),就能够等效为
[C{1}, C{2}, C{3}] = func(d{1}, d{2}, d{3}),可以写成

[C{:}] = func(d{:})

这个对于这个ind2sub函数可能会有点用。

>> help ind2sub
ind2sub - 将线性索引转换为下标此 MATLAB 函数 返回数组 row 和 col,其中包含与大小为 sz 的矩阵的线性索引 ind 对应的等效行和列下标。此处,sz 是包含两个元素的向量,其中 sz(1) 指定行数,sz(2) 指定列数。
>> sz = [2, 4]sz =2     4>> [idx{1:2}] = ind2sub(sz, 1:8)idx =1×2 cell 数组{[1 2 1 2 1 2 1 2]}    {[1 1 2 2 3 3 4 4]}

可以看到idx{1} - idx{2}就对应1,2,3,..., 8对应的二维数组下标。

这个函数对于更加复杂的gradientndgrid这些函数也挺好用的。

为了更好地提供多个输出值,Matlab还有一个函数deal专门来干这个事情。

>> help dealdeal - 将输入分发到输出此 MATLAB 函数 复制输入参数 A1,...,An,并将它们作为输出参数 B1,...,Bn 返回。它与B1 = A1、…、Bn = An 相同。在此语法中,输入和输出参数的数目必须相同。语法[B1,...,Bn] = deal(A1,...,An)[B1,...,Bn] = deal(A)

这样就可以在匿名函数中很容易定义多输出函数:

>> f = @(n)deal(n, n*n, n*n*n)f =包含以下值的 function_handle:@(n)deal(n,n*n,n*n*n)>> [results{1:3}] = f(10)results =1×3 cell 数组{[10]}    {[100]}    {[1000]}

通过deal函数,还能够很容易的设定结构数组的某个字段的值:

>> s = dir("*.m")s = 包含以下字段的 13×1 struct 数组:namefolderdatebytesisdirdatenum>> names = cellfun(@(fn) upper(fn), {s.name}, 'UniformOutput', false);
>> [s.uname] = deal(names{:})s = 包含以下字段的 13×1 struct 数组:namefolderdatebytesisdirdatenumuname

很容易地给数组的每个结构体增加一个字段uname是对应的名称的大写字符数组。

总结

  1. 逗号分割列表是一个字面上很简单的概念,就是a, b, c, d这个形式,允许不同类型的对象列在一起
  2. 元胞数组和字符串数组跟逗号分割列表之间的转换是操作函数输入输出的主要应用。

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

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

相关文章

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

网络一些相关术语

目录 网络一些相关术语 转发平面效率 可扩展性 控制平面 网络拓扑 服务质量(QoS) 网络协议 网络带宽 网络拥塞 网络安全 网络冗余 网络切片 网络延迟 网络地址转换(NAT) 虚拟专用网络(VPN) …

实验04while(简单循环)---7-2 整数的立方和

任务描述 给定一个正整数k&#xff08;1<k<10&#xff09;&#xff0c;求1到k的立方和m。即m12 * 2 * 2…k * k * k。 输入格式: 输入只有一行&#xff0c;该行包含一个正整数k。 输出格式: 输出只有一行&#xff0c;该行包含1到k的立方和。 输入样例: 5 输出样例: 2…

网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?

文章整体介绍 本文旨在解答关于微服务网关的三个核心问题&#xff1a; 1&#xff09;为什么需要网关&#xff1f;也即在何种场景下应采用微服务网关以优化系统架构&#xff1b; 2&#xff09;什么是微服务网关&#xff1f;主要讲构成微服务网关的关键能力&#xff0c;包括但…

008:光盘映像文件处理工具UltraISO安装教程

摘要&#xff1a;本文详细介绍光盘映像文件处理工具UltraISO的安装流程。 一、软件介绍 UltraISO是一款功能强大的光盘映像文件处理工具&#xff0c;支持ISO文件的制作、编辑、转换、压缩、刻录以及启动盘制作&#xff0c;广泛应用于数据备份、软件分发和系统安装等领域。 二…

地磁传感器(学习笔记下)

咱们接着学习笔记上来学习哈&#xff0c;首先&#xff0c;我们编写读取方位角程序&#xff0c;配置好传感器以后&#xff0c;我们就可以读取磁力值了&#xff0c;我们先定义一个结构体类型&#xff0c;用来存放磁力值以及方位角值。这个结构体&#xff0c;放到qmc5883l.h文件中…

从GPT定制到Turbo升级再到Assistants API,未来AI世界,你准备好了吗?

引言 在OpenAI DevDay发布会上&#xff0c;OpenAI再次震撼整个人工智能行业&#xff0c;为AI领域带来了重大的更新。CEO Sam Altman宣布推出了定制版本的ChatGPT&#xff0c;这意味着用户现在可以根据自己的需求打造个性化的GPT&#xff0c;并分享至GPT Store。这一消息对于受…

神经架构搜索:自动化设计神经网络的方法

在人工智能&#xff08;AI&#xff09;和深度学习&#xff08;Deep Learning&#xff09;快速发展的背景下&#xff0c;神经网络架构的设计已成为一个日益复杂而关键的任务。传统上&#xff0c;研究人员和工程师需要通过经验和反复试验来手动设计神经网络&#xff0c;耗费大量时…

实验03分支7-13 算术入门之加减乘除

对于输入的两个整数&#xff0c;按照要求输出其和差积商。 输入格式: 在一行内输入两个不超过100的非负整数a和b&#xff0c;中间以一个空格间隔&#xff0c;且保证b不为0。 输出格式: 共四行&#xff0c;格式是&#xff1a; [a] [b] [ab] [a] - [b] [a-b] [a] * [b] [a…

cvxopt.matrix函数

cvxopt.matrix 是 cvxopt 库中的一个核心类&#xff0c;用于在凸优化问题中表示矩阵。它可以存储稀疏或密集矩阵&#xff0c;支持从多种数据类型&#xff08;如列表、NumPy 数组等&#xff09;创建矩阵。cvxopt.matrix 在处理诸如二次规划、线性规划等优化问题时非常有用。 基…

P1588 [USACO07OPEN] Catch That Cow S

[USACO07OPEN] Catch That Cow S 题目描述 FJ 丢失了他的一头牛&#xff0c;他决定追回他的牛。已知 FJ 和牛在一条直线上&#xff0c;初始位置分别为 x x x 和 y y y&#xff0c;假定牛在原地不动。FJ 的行走方式很特别&#xff1a;他每一次可以前进一步、后退一步或者直接…

【MySQL】日志

1. 日志基本了解 常见的MySQL Server日志类型&#xff0c;以及记录的日志信息&#xff08;场景通俗理解&#xff09; 错误日志 记录的主要信息由服务器关闭、启动、崩溃事件&#xff1b;MySQL运行过程中出现的错误、警告和严重事件以及与权限、配置相关的问题使用场景 诊断MyS…

编译上下文

文章目录 作用域、可见性函数作用域文件作用域语句块作用域函数原型作用域 标识符的存储类型全局对象与函数静态对象与函数局部对象 作用域、可见性 一个变量标识符只有在特定的某段儿程序区域&#xff08;作用域&#xff09;内才可以起作用&#xff08;可见性&#xff09;。 …

【Linux】【xmake】安装 + C/C++常用项目配置

文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…

光伏MPPT追踪的仿真设计

利用Simulink可实现如下功能&#xff1a;改变光照时有MPPT追踪并低电压穿越的能力。 MPPT控制器的全称为“最大功率点跟踪”&#xff08;Maximum Power Point Tracking&#xff09;太阳能控制器&#xff0c;检测主回路直流电压及输出电流&#xff0c;计算出太阳能阵列的输出功…

5.15 加载内核映像文件(1)

首先是 连接脚本与 实际的内核映像大小的关系&#xff1a; 关于ELF 格式的了解&#xff1a; 如何通过 ELF 头&#xff0c; 找到各个段。 网上的关于elf 的截图&#xff1a; 那么 segment 与 section 有什么区别呢&#xff1f; 也就是说&#xff0c; section值得是 单个C文件的…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器&#xff1a; 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

安全知识见闻-脚本语言对与安全的重要性

脚本语言 脚本语言的安全性 编写恶意软件的要求 一、部分脚本语言的类型 二、宏病毒&#xff08;Macro Virus&#xff09; 1.编写宏病毒的要求 三、批处理文件&#xff08;bat&#xff09;和PowerShell 1. 批处理文件&#xff08;.bat&#xff09; 1.1. 什么是批处理文…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…

Junit5中用Excel进行数据驱动

在上一篇博文《Junit5中实现参数化测试》中,我们提到过,Junit5能够使用CsvFileSource参数源来实现外部数据的引入并作为参数传递给测试方法。 但实际应用中我们经常使用excel文件来保存测试数据或进行数据驱动。 今天就介绍下如何通过junit5的参数化方法,来支持Excel文件的…