D2_2MATLAB中的字符与字符串

一、字符与字符串的创建

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值