第5章:5.4.2 字符串数组的基本操作(MATLAB入门课程)

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

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

在文本数据预处理阶段,我们通常需要对字符串数组进行基本的操作。我们将从字符串数组的引用开始,逐步探索它们的修改和删除方法。紧接着,我们将学习如何有效地拼接和重构字符串数组,以便它们能够适应更加复杂的数据处理需求。

1)引用字符串数组

在MATLAB中,有两种方式引用字符串数组:使用小括号()和使用大括号{}引用。这两种引用方式和元胞数组的引用方式非常相似,下面我们来看例子:

使用小括号()引用返回的是字符串类型:引用单个位置的元素返回的是一个字符串标量;引用多个位置的元素返回的是一个字符串数组。具体引用方式类似于数值数组:

使用大括号{}引用返回的是字符向量类型:返回的结果类似于对字符向量元胞数组使用大括号进行引用。(拓展:你也可以使用char函数将字符串类型转换为字符数组类型)

当然,我们也可以使用链式索引。和元胞数组的引用类似,使用链式索引时如果用到了小括号(),那它需要被放置在索引表达式的末尾。

拓展:如何反转字符串中的字符顺序?

对于字符向量,反转字符顺序非常容易:

然而,上述这些方法对字符串都失效了:

为什么MATLAB会返回和s2相同的结果呢?这是因为s2是一个字符串标量,它是一个整体。如果是一个字符串向量,则会颠倒向量中各字符串元素的位置:

因此,使用end:-1:1进行索引,只会将字符串数组中的元素顺序进行反转。要想对字符串中的字符顺序进行反转,有以下两种解决方法:

(1)先将字符串转换为字符向量,然后再进行反转:

这样得到的结果是一个字符向量类型,如果你希望结果也是字符串类型,你可以套用一个string函数:

上面的s2是一个字符串标量,如果我们想对一个字符串数组中的所有字符串标量分别进行反转,应该如何操作呢?此时我们可以考虑使用循环语句。

首先,我们使用strings函数初始化一个和s3相同大小的空的字符串数组ss,用来保存结果。在循环体内,我们使用大括号{}依次取出s3中的每个元素,将其反转后再转换回字符串类型。注意:代码中对ss的第ii个位置元素进行了修改,后文还会详细介绍字符串数组的修改。显然,这种方法写起来很麻烦也不容易理解,因此下面我们介绍一种更好用的方法。

(2)使用reverse函数

reverse函数在2016b版本中推出,它能反转文本中的字符顺序。它支持字符向量、字符向量元胞数组以及字符串数组类型:

2)修改和删除字符串数组

在MATLAB中,字符串数组的修改和删除操作与元胞数组类似,支持小括号()和大括号{}两种不同的方式。

修改操作:

使用小括号()修改字符串数组时,等号右侧的值可以是字符串、字符向量或字符向量元胞数组,只要大小兼容即可。这种修改方式的灵活性使得修改字符串数组成为一项简单且直观的任务。

然而,当使用大括号{}对字符串数组的元素进行修改时,等号右侧的值只能是字符向量。

因此,在实际操作中,使用小括号()进行字符串数组的修改是更为常见和方便的做法。

删除操作:

要删除字符串数组中的元素,可以将等号右侧改为空向量[]。

使用小括号()进行删除操作时会改变数组中元素的数量;使用大括号{}则不会改变数组中元素的数量,被删除的位置元素会被缺失字符串代替。

拓展:缺失字符串<missing>在MATLAB字符串数组中的功能类似于数值数组中的NaN,它标示着某个位置的字符串值是缺失的。这种机制在处理包含不完整数据的字符串数组时非常有用。后续章节我们会专门讲解MATLAB的数据分析,到时候会介绍缺失值的处理方法。

拓展:使用加号(+)连接字符串数组

在 MATLAB 中,我们可以使用加号(+)对字符串数组进行操作。这种方法类似于数值数组的加法运算,但在字符串数组中,它被用于连接字符串元素。以下是一些示例,展示了如何在不同情况下使用加号(+)连接字符串数组:

从上面的例子可以看出,对字符串数组使用加法运算非常方便,也非常灵活。下面我们来看一道综合性较强的例子:随机生成新生儿的姓名。

变量s1和s2如下所示,它们分别表示姓氏和名字,请将姓氏和名称两两组合,生成所有可能的姓名,然后从中随机抽取10个互不相同的姓名保存到一个字符串向量中。

思路:首先要从s1和s2中分别提取姓氏和名字,并将提取的结果分别保存到两个字符串向量中;如果提取后的一个字符串向量为行向量、另一个字符串向量为列向量,那么就可以利用字符串加法运算的兼容模式得到所有组合后的姓名;最后我们可以借助第三章课后习题中介绍的randperm函数从所有可能的姓名中随机抽取10个互不相同的姓名。

代码如下:

%  s1和s2同上
s1 = s1{:}(isletter(s1));  % 借助isletter函数生成逻辑索引(这里用到了链式索引)
%  '王李张刘陈杨黄周胡赵'
s1 = string(s1');  % 将上一步得到的s1转置后,再转换为字符串类型
%  s1: 10×1 string 数组  [ "王"; "李";  ...  "胡"; "赵"]
s2 = strsplit(s2,'、');  % 使用strsplit函数对s2进行拆分,得到一个行字符串向量
%  s1: 1×12 string 数组 [ "辰" "瑞"  ...  "浩然" "奕泽"]
name = s1 + s2  % 利用加法的兼容性得到所有的名字
%  name: 10×12 string 数组
ind = randperm(numel(name),10); % 从1-numel(name)的序列中随机抽取10个作为索引
name10 = name(ind)  % 使用ind索引从name中抽取10个姓名(ind实际上是线性索引)

3)字符串数组的拼接、重构、重复和排序

下面我们来介绍如何对字符串数组进行拼接、重构、重复以及排序操作。这些操作对于数据预处理、文本分析和其他需要灵活处理字符串的场景至关重要。

拼接操作:

字符串数组的拼接方式和数值数组非常相似,我们既可以使用中括号[]进行拼接,还可以借助cat、horzcat和vertcat函数进行拼接。另外,拼接的文本类型除了字符串之外,也支持字符向量、字符向量元胞数组、数值数组等,MATLAB会自动将它们转换成字符串类型,这一操作类似于我们前面介绍的混合创建字符串数组。

重构操作:

重构操作(又称重塑操作)是指更改数组的形状或维度,同时保留其数据内容。我们可以使用reshape函数对字符串数组进行重构操作。它的用法非常简单,我们来看一个例子:

重复操作:

在第三章矩阵操作中,我们介绍过repmat函数和repelem函数,它们分别用于对数组整体进行堆叠和对数组中的元素进行重复。这两个函数也适用于字符串数组,我们来看例子:

排序操作:

第三章中我们介绍过两个排序函数,分别是sort函数和sortrows函数。其中,sort函数通常用于对向量进行排序,sortrows函数则基于矩阵的某一列对矩阵进行排序,排序后得到的新矩阵的同一行元素不会改变。

这两个函数也适用于字符串数组。以升序排列为例,字符串在排序时是逐字符进行比较的,对于每一对比较的字符,它们的Unicode编码被用来确定排序顺序,Unicode编码较小的字符会被排在前面。如果一个较短的字符串的所有字符和另一个更长的字符串的前面字符完全相同,那么这个较短的字符串排在前面。

下面来看例子:

排序结果 sort_s 是基于每个字符串元素的 Unicode 字符编码进行排序的。具体解释如下:

  • ” z” 排在最前面,因为它以空格字符开始,而空格的 Unicode 编码小于任何字母或数字的编码。
  • “123” 排在 ” z” 之后,因为数字的 Unicode 编码小于字母的编码。
  • 接下来是 “A” 和 “Bc”,由于大写字母的 Unicode 编码小于小写字母,它们排在小写字母前。
  • “aa”, “ab”, “abc”, “ac”, “ba”, “bad”都是小写字母开始的字符串,且按照字母的 Unicode 编码顺序排列。

索引数组 ind 中的每个值表示排序后的数组sort_s中对应位置的元素在原始数组 s 中的位置。例如,ind(1) = 4 意味着sort_s中第一个元素 ” z” 是原始数组 s 中的第4个元素;同样,ind(2) = 6 表示sort_s中的第二个元素 “123” 是原始数组 s 中的第6个元素;依次类推。

另外,我们也可以对字符串数组使用sortrows函数。

下面来看一个例子,这个例子中的字符串数组s是我们随机生成的,它有4行3列,数组中的每个元素都是在字符集  ‘a’,  ‘b’,  ‘c’,  ‘d’  中随机抽取两个拼接而成的字符串标量。

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

MATLAB入门课程专栏

版权声明:本文为博主作者:数学建模学习交流原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_32589267/article/details/135323409

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2024年2月19日
下一篇 2024年2月19日

相关推荐