第5章:5.4.1 字符串数组的创建方法(MATLAB入门课程)

讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili

5.4 字符串数组

在本章5.2和5.3两个小节中,我们详细介绍了字符数组和元胞数组在文本数据处理中的应用。本节我们将重点学习字符串数组,这是MATLAB在2016b版本中引入的一种新的数据类型,对于用户而言,熟练掌握字符串数组的使用将会大大提升文本数据处理能力、增加代码运行的效率。

以下这段文字来自MATLAB官网,它介绍了字符串数组的发展历史

从这段文字可以看出, MATLAB的字符串数组自2016b版本引入后,经历了三个发展阶段:最初,字符串数组作为一种新的数据类型,专为文本处理而设计,支持了索引、重构、拼接等标准数组操作;随后在2017a版本中,MATLAB简化了字符串数组的创建过程,允许用户直接使用双引号创建字符串,极大地提高了字符串数组的易用性;到了2018b版本,字符串数组的应用范围大幅拓展,几乎涵盖了所有产品,显示出其在MATLAB文本处理中的核心地位。(注意:如果你安装的MATLAB版本低于2018b,那么在某些函数中使用字符串类型作为输入参数可能会报错,例如我们上一章学的input、warning和error函数。因此本课程建议大家安装的MATLAB版本尽量高一点,详细的安装建议可以看本书的第一章)

在本节中,我们将深入探索MATLAB中的字符串数组,并详细介绍如何有效地利用这一强大的文本数据类型。具体内容包括  :

  1. 字符串数组的创建方法:本节将介绍如何利用双引号快速创建字符串数组,以及如何将其他数据类型转换为字符串数组的方法。
  2. 字符串数组的基本操作:本节将详细介绍字符串数组的引用、修改、删除、拼接、重构等基本操作。
  3. 字符串数组的运算方法:本节将学习字符串数组的运算方法,主要讲解关系运算和集合运算。
  4. 字符串数组的配套函数:伴随着字符串数组类型的发布,MATLAB在2016b版本中也推出了许多配套的字符串处理函数,这些函数涵盖文本处理的方方面面。因此,这一小节是我们需要重点学习的部分,熟练掌握这些新推出的函数将大大提高文本处理效率。
  5. 字符串数组的综合练习:最后,通过具体案例展示字符串数组在文本数据处理和分析中的实际应用,突出其在实际应用场景中的实用性。

5.4.1 字符串数组的创建方法

从MATLAB2017a版本开始,我们可以使用英文的双引号来创建字符串,例如:

上面我们创建的s1和s2均是字符串标量(即单个字符串),大家可以使用size函数查看它们的大小:

双引号表示的字符串需要看成一个整体,这一点一定要和字符向量区分开。

此外,我们可以使用其间不包含任何内容的双引号来创建空字符串 (""),请注意,空字符串的大小是1×1,而不是 0×0,这和字符向量有很大区别:

如果我们将多个字符串标量使用中括号[]拼接起来,就能创建字符串数组。这种创建方法和第三章介绍的数值数组的方法一致:同行元素(这里是单个字符串)之间用逗号或者空格分隔,行与行之间用分号或回车键分隔。

下面再来介绍两个在MATLAB 2016b版本中推出的非常实用的函数:strings和string。

1)使用 strings 函数创建空的字符串数组

strings 函数用来创建空的字符串数组。当我们需要初始化一个特定大小的字符串数组,并在后续代码中去动态地填充数组元素时,就需要用到这个函数。

例如,创建一个2行3列的空字符串数组:

上面代码中,我们使用了两种方法创建这个2行3列的空字符串数组,里面的每个元素都是空字符串。此外,我们回顾了strcmp函数和isequal函数的使用方法:strcmp函数会将ss1和ss2中相同位置的元素进行比较,因此返回的是一个大小为2×3的逻辑数组;isequal函数则会比较ss1和ss2两个数组整体是否等效,因此返回的是一个逻辑标量。

2)使用 string 函数将其他数据类型转换为字符串数组

string函数能够将不同类型的数据转换为字符串类型。这一功能在数据处理中非常实用,尤其是在需要将各种数据统一为字符串进行分析时。

此外,string函数还能将逻辑数组和数值数组转换成字符串数组:

拓展一:将文本转换为数值数组

前文中我们介绍过num2str函数,它能将数值数组转换为字符数组;这一小节我们又介绍了string函数,它能将数值数组转换为字符串数组。

现在,让我们探讨相反的转换过程:将包含数值的文本数据类型转换回数值数组。这一过程在数据处理和分析中非常重要,特别是当我们需要从文本格式的数据中提取数值进行计算或分析时。下面我们介绍MATLAB中三个用来转换的函数:

1)使用 str2num函数转换字符数组或者字符串标量

str2num 函数主要用于将字符数组转换为数值数组,它的作用和num2str函数刚好相反。当我们从文件中读取的数据或者用户输入的数据是字符数组类型时,我们会用到这个函数:

如果 str2num 函数不能将输入参数解析为数值,则返回空向量[]。

另外,在较高版本的MATLAB中,str2num函数也能用于字符串标量的转换,但不支持字符串数组:

事实上,str2num函数的底层是通过另一个内置函数:eval函数实现的。在MATLAB中,eval函数用于将输入的文本作为语句执行。例如:运行eval('a = [3 3*4]')等价于执行a = [3 3*4]。本书会在后续章节中介绍eval函数的更多应用以及它可能带来的问题。

因此,str2num函数中输入的文本可以包含数学表达式,例如:

最后,str2num函数可以有两个返回值:[X, tf] = str2num(txt),如果str2num函数成功转换输入的文本txt,则第二个返回值tf等于逻辑值1,否则,tf等于逻辑值0.

2)使用 double函数转换字符串数组

在本章5.2节介绍字符数组时,我们知道double函数能将字符数组中的字符元素转换为对应的Unicode编码:

这里我们介绍它的另一种用法:将字符串数组转换为对应的数值数组。注意,单个的字符串标量中仅能包含单个数字,如果有多个数字就会转换失败。当转换失败时,数组中对应位置的元素为NaN(第二章介绍过,NaN或nan表示不定值或缺失值)。

此外,和str2num函数不同,double函数不支持字符串中出现表达式:

3)使用str2double函数进行转换

str2double函数支持的数据类型比前两个函数更多,它支持字符数组、字符向量元胞数组和字符串数组三种数据类型,我们分别来进行介绍。

情况一:对字符数组进行转换:str2double函数能将字符数组转换为单个数值标量,其中表示数值的文本中可以包含千位分隔符(英文的逗号),这是str2num所不支持的。 如果输入的字符数组无法转换为数值标量,那么str2double函数会返回NaN.

str2double函数也不支持文本中出现表达式:

另外,如果你要转换的字符数组中包含多个数值时,那么str2double函数会尝试将结果拼接成一个数值标量,并返回这个数值标量,而不是返回一个数值数组:

因此,当我们希望将包含多个数值的字符数组转换为数值数组时,请改用 str2num 函数。

情况二:对字符向量元胞数组进行转换:前两个函数都不支持字符向量元胞数组的转换,只有str2double函数支持,它能将字符向量元胞数组转换为一个数值数组。如果元胞数组中的某个字符向量转换失败,则返回的数值数组的相同位置元素为NaN.

情况三:对字符串数组进行转换:当str2double函数用于字符串数组时,它的作用和double函数相同。

拓展一的总结:我们介绍了三个用于将包含数值的文本转换为数值数组的函数:str2num、double和str2double。这函数各有特点和应用场景,在涉及到将复杂文本数据转换为数值数据时,选择合适的函数可以有效地提高数据处理的效率和准确性。

拓展二:混合创建字符串数组

在创建字符串数组时,MATLAB允许我们将数值、字符数组、逻辑值以及字符向量元胞数组混合在一起创建。注意:创建时至少有一个元素需要是字符串类型下面来看例子:

需要注意的是,混合创建时,各元素的大小需要兼容,以便它们能恰好组合成一个字符串数组。如果大小不兼容,MATLAB会提示错误,例如:

这些示例展示了MATLAB在创建字符串数组的强大能力,这种创建方式也为文本数据分析和处理提供了更多的灵活性和便利。

拓展三:计算字符串包含的字符数量

由于字符串标量是一个整体,使用sizelengthnumel函数无法得到字符串中包含的字符数量。为了解决这一问题,MATLAB在2016b版本中引入了一个专门的函数:strlength

它的使用方法非常简单,我们直接来看例子:

另外,该函数也能用于字符向量以及字符向量元胞数组:

因此,strlength函数为我们提供了一种统一的方法来计算不同类型文本数据中的字符数量。

拓展四:不推荐的字符串元胞数组

在MATLAB中,保存多段文本我们通常使用字符向量元胞数组或者字符串数组。事实上,当元胞数组中的每个数据都是字符串标量时,这样的元胞数组被称为字符串元胞数组。下面我们来看例子:

上面代码中创建的s3就是一个字符串元胞数组。MATLAB中,不推荐使用这种类型来保存文本数据。许多文本处理相关的函数都不支持字符串元胞数组类型,例如:

为什么MATLAB不推荐大家使用字符串元胞数组类型呢?下面我们简单介绍下MATLAB中数据的内存管理:

可以看到,包含相同文本的三个数组中,字符串数组s1占用的内存最少,而字符串元胞数组s3占用的内存最多

事实上,即使这些数据类型包含的都是空文本,MATLAB 也会占用一定的内存:

MATLAB 中字符串的内存占用不仅仅取决于其内容(如字符的数量),还与字符串对象本身的内部结构有关。字符串对象在 MATLAB 中被实现为一种复杂的数据结构,它不仅包含字符数据,还有其他与字符串相关的信息和属性。这就解释了为什么即使是一个空字符串(没有任何字符),也会占用一定的内存空间。元胞数组也是同样的道理,即使里面仅包含空字符向量或空字符串,也会占用一定的内存。

另外,对于同一个字符串或者元胞数组,在不同版本的 MATLAB 中也可能占用不同的内存。这通常是由于内部实现的差异所致,而不一定直接反映了保存数据的实际大小。通常,随着 MATLAB 版本的更新,数据类型内部的数据结构可能进行了优化或修改,这样能够提高性能或增加新的功能。


  点击下方的CSDN专栏阅读下一篇文章:

MATLAB入门课程专栏

  • 28
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值