本节将介绍如何利用双引号快速创建字符串数组,以及如何将其他数据类型转换为字符串数组的方法。
1.英文的双引号来创建字符串
从 MATLAB2017a版本开始,我们可以使用英文的双引号来创建字符串。
Matlab
s1 = "You are so good!" %s1和s2均是字符串标量(即单个字符串)
s2 = "你真棒!"
size(s1) % 1行1列
c1 = 'good'; % 字符向量
size(c1) % 1行4列
s3 = "" % 空字符串,空字符串的大小是1x1,而不是0x0,这和字符向量有很大区别
size(s3) % 1行1列
c3 = '' % 空字符向量
size(c3) % 0 0
isempty(s3) % 0
isempty(c3) % 1
s4 = ["good","great","perfect"] %如果我们将多个字符串标量使用中括号[]拼接起来,就能创建字符串数组。
s44 = ['good','great','perfect'] %字符向量拼接
s5 = ["yes", "no"; %字符串矩阵
"or", "if";
"and", "of"]
[r,c] = size(s5)
length(s5)
numel(s5)
2.使用strings函数创建空的字符串数组
strings 函数用来创建空的字符串数组。当我们需要初始化一个特定大小的字符串数组,并在后续代码中去动态地填充数组元素时,就需要用到这个函数。
Matlab
ss1 = strings(2,3) %或者strings([2,3])
ss2 = ["", "", "";
"", "", ""]
strcmp(ss1,ss2) %比较数组中对应位置的元素是否相同
isequal(ss1,ss2) %比较两个数组整体是否等效
3.使用string函数将其他数据类型转换为字符串数组
string函数能够将不同类型的数据转换为字符串类型。这一功能在数据处理中非常实用,尤其是在需要将各种数据统一为字符串进行分析时。
Matlab
c1 = '你好呀'; % 字符向量
string(c1)
c2 = char('good','great'); % 字符矩阵
s2 = string(c2)
strip(s2) % 删除空白字符 也能使用strtrim或deblank函数
c3 = {'good','great'}; % 字符向量元胞数组
s3 = string(c3)
x1 = ([3 6 7 5] > 5)
s1 = string(x1)
x2 = 1:15;
s2 = string(x2)
x3 = [1 2 pi; exp(1) 5 6];
s3 = string(x3)
4.拓展一将文本转换为数值数组
前文中我们介绍过num2str 函数,它能将数值数组转换为字符数组;这一小节我们又介绍了string函数,它能将数值数组转换为字符串数组。现在,让我们探讨相反的转换过程:将包含数值的文本数据类型转换回数值数组。这一过程在数据处理和分析中非常重要,特别是当我们需要从文本格式的数据中提取数值进行计算或分析时。下面我们介绍MATLAB中三个用来转换的函数:
(1)使用 str2num 函数转换字符数组或者字符串标量
str2nu 函数主要用于将字符数组转换为数值数组,它的作用和num2str 函数刚好相反。当我们从文件中读取的数据或者用户输入的数据是字符数组类型时,我们会用到这个函数。
Matlab
%在较高版本的MATLAB中,str2num函数也能用于字符串标量的转换,但不支持字符串数组
c1 = '1.5 4.3 6.5'
str2num(c1)
c2 = ['1';'2';'3']
str2num(c2)
c3 = num2str(rand(2,3))
str2num(c3)
c4 = '1、2、3'
str2num(c4) %如果 str2num 函数不能将输入参数解析为数值,则返回空向量[]
s1 = "1,2,3"; % MATLAB高版本才能运行,低版本会报错
str2num(s1)
s2 = ["1", "5 6"]
str2num(s2) %会报错:输入必须为字符向量或字符串标量。
a = [3 3*4]
eval('a = [3 3*4]') %str2num函数的底层是通过另一个内置函数:eval数实现的。在MATLAB中eval 函数用于将输入的文本作为语句执行。
cc = char('3 3*5 6/4',' pi exp(3) sin(pi/2)')
str2num(cc)
% 最后,str2num 函数可以有两个返回值:[X,tf]=str2num(txt),
% 如果 str2num 函数成功转换输入的文本 txt,则第二个返回值tf等于逻辑值1,
% 否则,tf等于逻辑值0.
[x1,tf1] = str2num('1,2,3')
[x2,tf2] = str2num('1、2、3')
(2)使用 double 函数转换字符串数组
在本章5.2节介绍字符数组时,我们知道double函数能将字符数组中的字符元素转换为对应的 Unicode 编码,这里我们介绍它的另一种用法:将字符串数组转换为对应的数值数组。注意,单个的字符串标量中仅能包含单个数字,如果有多个数字就会转换失败。当转换失败时,数组中对应位置的元素为NaN(第二章介绍过,NaN或nan表示不定值或缺失值)。
Matlab
c = char('abc','defg');
double(c)
s1 = "1024"
double(s1)
s2 = "1 2 3"
double(s2) %nan
s3 = string(rand(2,3))
double(s3)
s4 = ["1.3e4","-688","a","1,3"];
double(s4)
s5 = ["pi", "3.14", "1+1";
"a", "6", "666"]
double(s5)
%和str2num函数不同,double函数不支持字符串中出现表达式
(3)使用str2double 函数进行转换
str2double 函数支持的数据类型比前两个函数更多,它支持字符数组、字符向量元胞数组和字符串数组三种数据类型,我们分别来进行介绍。
情况一:对字符数组进行转换:str2double函数能将字符数组转换为单个数值标量,其中表示数值的文本中可以包含千位分隔符(英文的逗号),这是str2num所不支持的。 如果输入的字符数组无法转换为数值标量,那么str2double 函数会返回 NaN。
Matlab
c1 = '31,050'
str2double(c1) %31050
str2num(c1) % 31 50
double(c1)
double(string(c1)) %31050
c2 = '1\2\3'
str2double(c2)
c1 = '1+1';
%另外,如果你要转换的字符数组中包含多个数值时,那么str2double函数会尝试将结果
%拼接成一个数值标量,并返回这个数值标量,而不是返回一个数值数组
str2double(c1) %str2double不支持表达式
c2 = '1 2 3' % 空格隔开
str2double(c2)
c3 = '1,2,3' % 逗号隔开
str2double(c3) % 123
c4 = '1, 2, 3' % 逗号加空格隔开
str2double(c4)
c5 = ['1';'2';'3'] % 列字符向量
str2double(c5)
c6 = ['1234';
'5678'];
str2double(c6) % 按照线性索引的顺序转换
情况二:对字符向量元胞数组进行转换:前两个函数都不支持字符向量元胞数组的转换,只有 str2double 函数支持,它能将字符向量元胞数组转换为一个数值数组。如果元胞数组中的某个字符向量转换失败,则返回的数值数组的相同位置元素为NaN。
Matlab
c = {'1.2','3.5';'xyz','8.8'}
str2double(c)
% str2num(c)
% double(c)
情况三:对字符串数组进行转换:当str2double函数用于字符串数组时,它的作用和double 函数相同。
Matlab
s = ["pi", "3.14", "1+1";
"a", "6", "666"]
str2double(s)
拓展一的总结:我们介绍了三个用于将包含数值的文本转换为数值数组的函数:str2num、double和 str2double。这三个函数各有特点和应用场景,在涉及到将复杂文本数据转换为数值数据时,选择合适的函数可以有效地提高数据处理的效率和准确性。
拓展二:混合创建字符串数组
在创建字符串数组时,MATLAB允许我们将数值、字符数组、逻辑值以及字符向量元胞数组混合在一起创建。注意:创建时至少有一个元素需要是字符串类型。
Matlab
s1 = ["abc",'ab',100]
s2 = [1,2,3;
"yes",true,"no"]
s3 = [{'你好','我好'},"大家好"]
s4 = [char('a','bc');"defg"]
s5 = [{'你好','我好'}; "大家好"] %会报错:要串联的数组的维度不一致。
%需要注意的是,混合创建时,各元素的大小需要兼容,以便它们能恰好组合成一个字符
%串数组。如果大小不兼容,MATLAB会提示错误
拓展三:计算字符串包含的字符数量
由于字符串标量是一个整体,使用 size、length 和 numel 函数无法得到字符串中包含的字符数量。为了解决这一问题,MATLAB在 2016b版本中引入了一个专门的函数:strlength。
Matlab
s1 = "Hello,你好!";
strlength(s1)
s2 = ["yes", "no", "sorry";
"or", "if", "good"];
strlength(s2)
s3 = strings(3); % 3行3列的空字符数组
strlength(s3)
c1 = 'a':'z'
strlength(c1)
c2 = {'abc','','3*4=5';
newline,'1234',char(0)};
strlength(c2)
拓展四:不推荐的字符串元胞数组
在MATLAB中,保存多段文本我们通常使用字符向量元胞数组或者字符串数组。事实上,当元胞数组中的每个数据都是字符串标量时,这样的元胞数组被称为字符串元胞数组。(不推荐,因为占用内存比较大)
Matlab
clear
s1 = ["Good","Great","Yes"]
s2 = {'Good','Great','Yes'}
s3 = {"Good","Great","Yes"}
% strlength(s3)
% lower(s3)
whos
clear
s = "";
c1 = {''};
c2 = {""};
whos