一、字符与字符串的创建
1.字符的创建
字符在 MATLAB 里是以 ASCII 码值的形式存储的,一个字符占用一个字节(8 位)。你可以使用单引号来创建字符变量。
% 创建一个字符变量
charVar = 'A';
% 查看字符对应的ASCII码值
asciiValue = double(charVar);
disp(['字符 ''A'' 的ASCII码值是: ', num2str(asciiValue)]);
%字符 'A' 的ASCII码值是: 65
2.字符串的创建
从 R2016b 版本开始,MATLAB 引入了字符串数据类型,使用双引号来创建。字符串本质上是字符数组的容器,它能存储多个字符,并且可以更方便地进行字符串操作。
% 创建一个字符串变量
strVar = "Hello, World!";
注意:对于字符或者字符串中含有单引号或者双引号的情况,该单引号或者双引号需要使用两倍的单引号或者双引号来表示。
str1 = 'It''s a beautiful day.';
disp(str1);
str2 = "He said: ""Hello!""";
disp(str2);
3.字符数组和字符串数组的创建
MATLAB中有两种表示文本的方式:字符串数组或字符向量(数组)
字符数组(char类型)是一个字符序列,就像数值数组是一个数字序列一样。它的一个典型用途是使用单引号将短文本片段存储为字符向量
字符串数组(string类型)是文本片段的容器,字符串数组提供一组用于将文本处理为数据的函数
% 创建字符数组
charArray1 = 'Hello';
charArray2 = ['Hello', ' ', 'World'];
charArray3 = char('A', 'B', 'C');
% 创建字符串数组
% 方法1:直接使用双引号创建
strArray1 = "Hello";
strArray2 = ["Hello", "World", "MATLAB"];
% 方法2:使用 strings 函数创建
strArray3 = strings(2, 3);
strArray3(1, 1) = "Apple";
strArray3(1, 2) = "Banana";
strArray3(1, 3) = "Cherry";
strArray3(2, 1) = "Dog";
strArray3(2, 2) = "Elephant";
strArray3(2, 3) = "Fish";
% 方法2:从字符数组转换
charArray = ['Hello'; 'World'];
strArray4 = string(charArray);
% 方法2:从元胞数组转换
cellArray = {'Red', 'Green', 'Blue'};
strArray5 = string(cellArray);
% 方法3:使用循环创建
n = 5;
strArray6 = strings(1, n);
for i = 1:n
strArray6(i) = ["String_", num2str(i)];
end
它们在存储形式上也有一些区别,可以使用whos来查看
c = 'Hello World';
d = "Hello World";
whos c;
whos d;
运行后的结果如图所示:
字符数组和字符串虽然都能表示文本,但在存储形式和内存占用上有很大不同。字符数组本质上是一个字符的矩阵,内存占用主要取决于字符数量;而字符串是一种更高级的数据类型,有额外的元数据,虽然使用起来更方便,但会占用更多内存。
二、字符/字符串数组的基本操作
1.1访问字符数组元素
% 创建一维字符数组
charArray = 'HelloWorld';
% 访问单个元素
singleChar = charArray(3);
disp(['单个元素: ', singleChar]);
% 访问多个连续元素
subCharArray = charArray(2:5);
disp(['连续子数组: ', subCharArray]);
% 访问指定位置的多个元素
indices = [1, 3, 5];
selectedChars = charArray(indices);
disp(['指定位置元素: ', selectedChars]);
% 创建二维字符数组
charMatrix = ['ABC'; 'DEF'; 'GHI'];
% 访问二维字符数组的单个元素
element = charMatrix(2, 3);
disp(['二维数组单个元素: ', element]);
% 访问二维字符数组的行
row = charMatrix(2, :);
disp(['二维数组第 2 行: ', row]);
% 访问二维字符数组的列
col = charMatrix(:, 3);
disp('二维数组第 3 列:');
disp(col);
1.2访问字符串数组元素
% 一维字符串数组
strArray = ["Apple", "Banana", "Cherry", "Date", "Eggplant"];
% 访问单个元素
singleElement = strArray(2);
% singleElement 的值为 "Banana"
% 访问多个连续元素
subArray = strArray(2:4);
% subArray 包含 "Banana"、"Cherry" 和 "Date"
% 访问指定位置的多个元素
indices = [1, 3, 5];
selectedElements = strArray(indices);
% selectedElements 包含 "Apple"、"Cherry" 和 "Eggplant"
% 二维字符串数组
strMatrix = ["Apple", "Banana", "Cherry"; "Dog", "Elephant", "Fish"];
% 访问二维字符串数组的单个元素
element = strMatrix(2, 3);
% element 的值为 "Fish"
% 访问二维字符串数组的行
row = strMatrix(2, :);
% row 包含 "Dog"、"Elephant" 和 "Fish"
% 访问二维字符串数组的列
col = strMatrix(:, 3);
% col 包含 "Cherry" 和 "Fish"
2.2修改字符数组元素
% 一维字符数组
charArray = 'Hello';
% 修改单个元素
charArray(3) = 'a';
% 修改一维数组单个元素后: Hella
% 重新初始化一维字符数组
charArray = 'HelloWorld';
% 修改多个连续元素
charArray(2:5) = 'abcd';
% 修改一维数组多个连续元素后: HabcdWorld
% 二维字符数组
charMatrix = ['ABC'; 'DEF'; 'GHI'];
% 修改二维数组单个元素
charMatrix(2, 3) = 'X';
% 修改二维数组单个元素后:
% ABC
% DEX
% GHI
% 重新初始化二维字符数组
charMatrix = ['ABC'; 'DEF'; 'GHI'];
% 修改二维数组一行
charMatrix(2, :) = 'XYZ';
% 修改二维数组一行后:
% ABC
% XYZ
% GHI
2.2修改字符串数组元素
% 一维字符串数组修改单个元素
strArray1 = ["apple", "banana", "cherry"];
strArray1(2) = "date";
% strArray1 现在为 ["apple", "date", "cherry"]
% 一维字符串数组修改多个连续元素
strArray2 = ["apple", "banana", "cherry", "date", "elderberry"];
strArray2(2:4) = ["fig", "grape", "honeydew"];
% strArray2 现在为 ["apple", "fig", "grape", "honeydew", "elderberry"]
% 二维字符串数组修改单个元素
strMatrix1 = ["apple", "banana", "cherry"; "date", "elderberry", "fig"];
strMatrix1(2, 3) = "grape";
% strMatrix1 现在为
% ["apple", "banana", "cherry";
% "date", "elderberry", "grape"]
% 二维字符串数组修改一行元素
strMatrix2 = ["apple", "banana", "cherry"; "date", "elderberry", "fig"];
strMatrix2(2, :) = ["grape", "honeydew", "kiwi"];
% strMatrix2 现在为
% ["apple", "banana", "cherry";
% "grape", "honeydew", "kiwi"]
% 二维字符串数组修改一列元素
strMatrix3 = ["apple", "banana", "cherry"; "date", "elderberry", "fig"];
strMatrix3(:, 3) = ["grape", "kiwi"];
% strMatrix3 现在为
% ["apple", "banana", "grape";
% "date", "elderberry", "kiwi"]
3.1删除字符数组的元素
% 删除一维字符数组单个元素
charArray = 'Hello';
charArray(3) = [];
% 删除一维数组单个元素后: Helo
% 删除一维字符数组多个连续元素
charArray = 'HelloWorld';
charArray(2:5) = [];
% 删除一维数组多个连续元素后: HWorld
% 二维字符数组删除行
charMatrix = ['ABC'; 'DEF'; 'GHI'];
charMatrix(2, :) = [];
% 删除二维数组一行后:
% ABC
% GHI
% 二维字符数组删除列
charMatrix = ['ABC'; 'DEF'; 'GHI'];
charMatrix(:, 3) = [];
% 删除二维数组一列后:
% AB
% DE
% GH
3.2删除字符串数组的元素
% 删除一维字符串数组单个元素
strArraySingle = ["apple", "banana", "cherry"];
strArraySingle(2) = [];
% strArraySingle 现在为 ["apple", "cherry"]
% 删除一维字符串数组多个连续元素
strArrayMulti = ["apple", "banana", "cherry", "date", "elderberry"];
strArrayMulti(2:4) = [];
% strArrayMulti 现在为 ["apple", "elderberry"]
% 删除二维字符串数组的行
strMatrixRow = ["apple", "banana", "cherry"; "date", "elderberry", "fig"];
strMatrixRow(2, :) = [];
% strMatrixRow 现在为 ["apple", "banana", "cherry"]
% 删除二维字符串数组的列
strMatrixCol = ["apple", "banana", "cherry"; "date", "elderberry", "fig"];
strMatrixCol(:, 3) = [];
% strMatrixCol 现在为
% ["apple", "banana";
% "date", "elderberry"]
4.1拼接字符数组
% 一维字符数组拼接
charArray1 = 'Hello';
charArray2 = ' World';
combinedArray = [charArray1, charArray2];
% 一维字符数组拼接结果: Hello World
% 二维字符数组按行拼接
charMatrix1 = ['ABC'; 'DEF'];
charMatrix2 = ['GHI'; 'JKL'];
verticalCombined = [charMatrix1; charMatrix2];
% 二维字符数组按行拼接结果:
% ABC
% DEF
% GHI
% JKL
% 二维字符数组按列拼接
charMatrix3 = ['123'; '456'];
horizontalCombined = [charMatrix1, charMatrix3];
% 二维字符数组按列拼接结果:
% ABC123
% DEF456
% 使用 strcat 函数拼接
charArray3 = '!';
combinedStr = strcat(charArray1, charArray2, charArray3);
% 使用 strcat 函数拼接结果: Hello World!
% 使用 sprintf 函数拼接
name = 'John';
age = 25;
info = sprintf('My name is %s and I am %d years old.', name, age);
% 使用 sprintf 函数拼接结果: My name is John and I am 25 years old.
4.2拼接字符数组
% 使用 + 运算符拼接两个字符串
str1 = "Hello";
str2 = " World";
combinedStr = str1 + str2;
% combinedStr 的值为 "Hello World"
% 使用 strcat 函数拼接字符串数组
strArray1 = ["Hello", "Goodbye"];
strArray2 = [" World", " Everyone"];
combinedArray = strcat(strArray1, strArray2);
% combinedArray 为 ["Hello World", "Goodbye Everyone"]
% 使用 join 函数拼接字符串数组元素
strArray = ["Apple", "Banana", "Cherry"];
joinedStr = join(strArray, ", ");
% joinedStr 的值为 "Apple, Banana, Cherry"
% 垂直拼接字符串数组
strMatrix1 = ["Apple", "Banana"; "Cherry", "Date"];
strMatrix2 = ["Eggplant", "Fig"; "Grape", "Honeydew"];
verticalCombined = [strMatrix1; strMatrix2];
% verticalCombined 为
% ["Apple", "Banana";
% "Cherry", "Date";
% "Eggplant", "Fig";
% "Grape", "Honeydew"]
% 水平拼接字符串数组
strMatrix1 = ["Apple", "Banana"; "Cherry", "Date"];
strMatrix3 = ["Eggplant", "Fig"];
horizontalCombined = [strMatrix1, strMatrix3];
% horizontalCombined 为
% ["Apple", "Banana", "Eggplant", "Fig";
% "Cherry", "Date", "Eggplant", "Fig"]
从前面四个示例可以看出,字符数组的本质存储了char类型数据的数组,字符串数组的本质存储了string类型数据的数组,字符(串)数组与数组的操作逻辑基本一致。
5. 查找字符
findstr
函数在较旧版本的 MATLAB 里常用于查找子字符串在字符数组中所有出现的位置。不过在较新版本中,官方更推荐使用 strfind
函数来处理字符串类型的数据。
% 定义一个字符数组
charArray = 'ababab';
% 定义要查找的子字符串
subStr = 'ab';
% 使用 findstr 查找子字符串所有出现的位置
positions = findstr(charArray, subStr);
% positions 的值为 [1, 3, 5],表示 'ab' 在 'ababab' 中分别从第 1、3、5 个字符位置开始出现
% 定义一个字符串
str = "ababab";
% 定义要查找的子字符串
subSubStr = "ab";
% 使用 strfind 查找子字符串所有出现的位置
positionsStr = strfind(str, subSubStr);
% positionsStr 的值为 [1, 3, 5],即 'ab' 在 'ababab' 中分别从第 1、3、5 个字符位置开始出现
通过这个函数结合"2.修改字符数组元素"可以做到将指定元素进行修改
6.字符的长度和大小
长度:使用 length
函数获取字符数组的长度。
大小:使用 size
函数获取字符数组的尺寸。
charArray = 'Hello';
len = length(charArray);
charArray1 = 'Hello';
sz = size(charArray);
charArray2 = "Hello";
sz = size(charArray);
length
函数返回的是数组最大维度的长度。对于一维的字符数组 charArray
,它的长度就是字符的个数。因此,len
的值会是 5,因为 'Hello'
这个字符数组包含 5 个字符
size
函数的作用是返回数组各个维度的大小。
由于 charArray1
是一维的,size(charArray1)
会返回一个包含该字符数组维度信息的向量。对于这个 'Hello'
字符数组,它有 5 个字符元素,并且是一维的,所以 sz
的值为 [1, 5]
。这表明该字符数组有 1 行 5 列
对于这个 charArray2
,它是一维的字符串,size(charArray2)
会返回一个包含该字符串维度信息的向量。因为它是一维的,所以 sz
的值为 [1, 5]
,这表明该字符串在逻辑上可看作有 1 行 5 列(这里的列数就是字符串的字符个数)。
这里也验证了一中的说法。
7.字符数组与数值数组的转换
字符转数值:使用 double
函数将字符转换为对应的 ASCII 码值。
数值转字符:使用 char
函数将 ASCII 码值转换为字符。
charArray = 'A';
asciiValue = double(charArray);
asciiValue = 65;
charValue = char(asciiValue);