matlab学习笔记:第五章5.4.1 字符串数组的创建方法

本节将介绍如何利用双引号快速创建字符串数组,以及如何将其他数据类型转换为字符串数组的方法。

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
相关推荐
大佬,救命!!!14 分钟前
fiddler抓包工具与requests库构建自动化报告
笔记·python·测试工具·fiddler·自动化·requests·开源推荐
半夏知半秋39 分钟前
unity中的Horizontal和Vertical介绍
笔记·学习·unity·c#·游戏引擎
乘风对月歌42 分钟前
Gradio入门学习笔记
数据库·笔记·学习
suzh1qian44 分钟前
Unity类银河战士恶魔城学习总结(P143 Save Inventory System 保存仓库中的物品)
学习·unity·c#·游戏引擎·bug
为啥我就不胖呢1 小时前
Jira使用笔记二 ScriptRunner 验证问题创建角色
笔记·jira
yuwinter2 小时前
鸿蒙HarmonyOS学习笔记(6)
笔记·学习·harmonyos
small陀螺2 小时前
STM32笔记(串口IAP升级)
笔记·stm32·嵌入式硬件
一尘之中2 小时前
如何做好一份技术文档?
人工智能·学习
Munger hunger3 小时前
学习Prompt Turning
学习·prompt