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) …

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

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

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

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

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

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

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

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

【MySQL】日志

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

【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可实现如下功能:改变光照时有MPPT追踪并低电压穿越的能力。 MPPT控制器的全称为“最大功率点跟踪”(Maximum Power Point Tracking)太阳能控制器,检测主回路直流电压及输出电流,计算出太阳能阵列的输出功…

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

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

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

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

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

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

GIT使用list

清空当前commit区 方法 1:软重置到初始状态 如果希望保留文件内容,但清空所有 commit 历史,可以使用以下命令: git reset --soft $(git rev-list --max-parents0 HEAD)解释: --soft 表示重置 commit 历史&#xff…

【机器学习】任务九:卷积神经网络(基于 Cifar-10 数据集的彩色图像识别分类、基于 CNN 的手写数字识别的实验)

1.卷积神经网络 卷积神经网络(Convolutional Neural Network, CNN)是一种专门用于处理数据网格结构(如图像、视频等)的深度学习模型,在计算机视觉任务中被广泛应用,如图像分类、目标检测、图像分割等。以下…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一,selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二,安装浏览器Chrome Alpine Linux 环境中没有google Chrome, 使用 Chromium 浏览器作为 Chrome 的替代品,Chromium 是 Chrome 的开源版本…

在GeoTools中的Shapefile属性表读取效率之Shp与Dbf对比

目录 前言 一、POI测试数据简介 1、选用的POI数据 2、关于数据的属性数据 二、属性数据读取的两种方式实现 1、基于DbaseFileReader的读取 2、基于SimpleFeatureSource的读取 三、实际运行对比 1、内存和CPU占用情况 2、运行耗时情况 四、总结 前言 众所周知&#x…

Unity3D 开发技巧

视频教程: Unity3D 开发技巧分享,你可能不知道的小知识 Unity中文课堂教程地址: Unity3D开发-你可能不知道的知识 | Unity 中文课堂 Start 函数可以用协程 默认协同函数 Start 可将 void 改为IEnumerator 作为协程启动 using System.Colle…

多层感知机的从零实现与softmax的从零实现(真·0000零基础)

今天再读zh.d2l书(4.2. 多层感知机的从零开始实现 — 动手学深度学习 2.0.0 documentation), 看了关于多层感知机的从零实现与softmax的从零实现 目录 mlp从零实现, 点击“paddle”的代码 点击“torch”的代码 训练 参数解…

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件:impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…

C#与C++交互开发系列(十二):托管和非托管内存管理策略

前言 在进行C#与C互操作开发时,内存管理是一个非常重要的环节。由于C#采用托管内存管理(由垃圾回收机制GC控制),而C则使用手动内存管理(需要开发者负责分配和释放内存),因此跨语言调用时&#…