跳转到内容

MATLAB 编程/字符串

来自维基教科书,开放的书籍,开放的世界


声明字符串

[编辑 | 编辑源代码]

字符串使用单引号 ( ' ) 声明

 >> fstring = 'hello'
 fstring =
 hello

在字符串中包含单引号需要这样做

 >> fstring = ''''
 fstring = 
 '
>> fstring = 'you''re'
 fstring =
 you're

连接字符串

[编辑 | 编辑源代码]

在 MATLAB 中,可以使用方括号将多个字符串连接(连接在一起形成一个链)。

<concatstring>=[<str1>,<str2>,<str3>,...];

以下是使用此连接函数的随机问候语消息。

>> subject='The quick brown fox ' %sentence beginning

subject =
    'The quick brown fox '
    
>> verb = 'jumps over '

verb =
    'jumps over '
    
>> object='the lazy dog'

object =
    'the lazy dog'
    
>> phrase=[subject,verb,object]

phrase =
    'The quick brown fox jumps over the lazy dog'

输入字符串

[编辑 | 编辑源代码]

为了让用户输入,我们可以使用input函数

>> name=input('Enter your names: ','s')
Enter your names: Matlab_User

name =
    'Matlab_User'

字符串操作

[编辑 | 编辑源代码]

统计重复的单词

[编辑 | 编辑源代码]
木chuck 的绕口令

考虑以下绕口令

一只土拨鼠能扔多少木头

如果土拨鼠能扔木头?

他会扔,他会,尽他所能,

并且扔的木头和土拨鼠一样多

如果土拨鼠能扔木头。

我们想知道单词wood在这个绕口令中出现了多少次。我们可以使用count函数。

>>%Declare woodchuck twister as an characther vectors
>> twister = 'How much wood would a woodchuck chuck if a woodchuck could chuck wood? He would chuck, he would, as much as he could, and chuck as much wood as a woodchuck would if a woodchuck could chuck wood.'

twister =
    'How much wood would a woodchuck chuck if a woodchuck could chuck wood? He would chuck, he would, as much as he could, and chuck as much wood as a woodchuck would if a woodchuck could chuck wood.'

>> count(twister,"wood")

ans =
     8

请注意,count函数统计字符串中模式的出现次数。

因此,它将在单词“woodchuck”中统计单词“wood”的出现次数。

现在,我们有另一个示例来统计所有时间中最著名的谚语中“the”这个单词的出现次数。

狡猾的棕色狐狸跳过懒惰的狗

phrase = 'The quick brown fox jumps over the lazy dog'
%count function is case-sensitive by default . It did not count The with capital 'T'
>> count(phrase,'the')

ans =
     1

%need to use IgnoreCase to turn off the case-sensitive words
>> count(phrase,'the','IgnoreCase',true)

ans =
     2

查找字符串的长度

[编辑 | 编辑源代码]

有时,您可能需要查找句子中单词的长度,这里length(string')函数可以为您提供帮助。

>> length(phrase)

ans =
    43

正如我们在下一节中看到的,可以看出字符串中正好有 43 个字符。

从字符串中提取单词

[编辑 | 编辑源代码]

要从字符串中提取特定单词,需要stringName(indexnumberfirst:indexnumberlast)

我们使用与上面相同的示例短语。

请注意,即使是空格也被视为字符串。

索引号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
字符串 T h e q u i c k b r o w n f o x j u m p s o vv e r t h e l a z y d o g

根据此示例,如果我们想提取单词brown foxlazy dog

我们可以看到每个单词分别由索引号 (11:19) 和索引号 (36:43) 表示。在 MATLAB 中,我们可以键入以下命令

>> phrase(11:19)

ans =
    'brown fox'

>> phrase(36:43)

ans =
    'lazy dog'

字符串的大小写

[编辑 | 编辑源代码]

对于字符串操作,例如将字符串转换为大小写,我们可以使用lowerupper函数。这将使字符串分别全部变为小写和 大写字符。

>>  upper(phrase)
>> %Convert the string to uppercase
ans =
    'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'

>> lower(phrase)
>> %Convert the string to lowercase
ans =
    'the quick brown fox jumps over the lazy dog'

反转字符串

[编辑 | 编辑源代码]

要反转字符串,我们可以使用reverse/flip函数。这将使字符串从最后一个索引号反转到第一个索引号,反之亦然。

>> reverse(phrase)

ans =
    'god yzal eht revo spmuj xof nworb kciuq ehT'

替换字符串中的字符

[编辑 | 编辑源代码]

要替换字符串中的特定单词,我们可以使用replace函数

replace 函数的语法如下:replace(stringName,oldword,newword)

>>% We don't want brown fox, we want to change to orange fox
>> replace(phrase,'brown','orange')

ans =
    'The quick orange fox jumps over the lazy dog'

有时,您可能希望一次替换多个单词,因此我们需要在向量中声明多个字符串。但在此之前,请确保旧单词和新单词的顺序/序列是正确的。

>>%declare vector where the old words are going to be replaced
>> old={'fox','dog'}

old =
  1×2 cell array
    {'fox'}    {'dog'}

>>%declare vector where the new words are going to do the replaing
>> new={'cheetah','sloth'}

new =
  1×2 cell array
    {'cheetah'}    {'sloth'}
    
>> % Replace old words (fox) and (dog) into (cheetah) and (sloth) . Make sure sequence is in correct order    
>> replace(phrase,old,new)

ans =
    'The quick brown cheetah jumps over the lazy sloth'

字符串作为字符数组

[编辑 | 编辑源代码]

MATLAB 中的字符串是字符数组。要查看这一点,请执行以下代码

 >> fstring = 'hello';
 >> class(fstring)
 ans = char

因为字符串是数组,所以许多数组操作函数都可用,包括:sizetranspose 等。可以对字符串进行索引以访问特定元素。

对字符数组执行算术运算会将其转换为双精度浮点数。

 >> fstring2 = 'world';
 >> fstring + fstring2
 ans = 223   212   222   216   211

这些数字来自数组中每个字符的 ASCII 标准。这些值是使用double 函数获得的,该函数将数组转换为双精度浮点数数组。

 >> double(fstring)
 ans = 104   101   108   108   111

‘char’ 函数可以将双精度浮点数的整数数组转换回字符。尝试将小数转换为字符会导致 MATLAB 向下取整。

 >> char(104)
 ans = h
 >> char(104.6)
 ans = h

特殊字符串函数

[编辑 | 编辑源代码]

由于 MATLAB 字符串是字符数组,因此可以使用一些特殊函数来比较整个字符串,而不仅仅是其组件。

deblank 从字符串中删除空格。

findstr(bigstring, smallstring) 查看较小的字符串是否包含在较大的字符串中,如果包含,则返回较小的字符串开始位置的索引。否则,它将返回 []。

strrep(string1, replaced, replacement) 将string1 中所有出现的replaced 替换为replacement

与有理数组不同,字符串不能使用关系运算符进行正确比较。要比较字符串,请使用strcmp 函数,如下所示

 >> string1 = 'a';
 >> strcmp(string1, 'a')
 ans = 1
 >> strcmp(string1, 'A')
 ans = 0

请注意,MATLAB 字符串区分大小写,因此 ‘a’ 和 ‘A’ 不相同。此外,strcmp 函数不会丢弃空格

 >> strcmp(string1, ' a')
 ans = 0

字符串在各方面必须完全相同。

如果输入是数字数组,则 strcmp 函数将返回 0,即使值相同。因此,它仅适用于字符串。对于数字值,请使用 == 运算符。

 >> strcmp(1,1)
 ans = 0.

将数字转换为字符。此函数在您要使用函数disp 值来限制小数点显示时非常有用。

>>%Limit the display of pi value to 9 decimal points
>> num2str(pi,'%1.9f')

ans =
    '3.141592654'

显示字符串变量的值

[编辑 | 编辑源代码]

如果您只想显示字符串的值,则可以省略分号,这在 MATLAB 中是标准的。

如果您想在命令窗口中与其他文本组合显示字符串,一种方法是使用数组表示法以及 ‘display’ 或 ‘disp’ 函数

 >> fstring = 'hello';
 >> display( [ fstring 'world'] )
 helloworld

MATLAB 不会在两个字符串之间添加空格。如果需要添加空格,则必须手动添加。

此语法也用于将两个或多个字符串连接成一个变量,这允许在字符串中插入不寻常的字符

 >> fstring = ['you' char(39) 're']
 fstring = you're

任何其他返回字符串的函数也可以在数组中使用。

您还可以使用 "strcat" 函数连接字符串,当使用两个字符串时,该函数与上述方法相同,但当使用字符串元胞数组时它特别有用,因为它允许您将同一内容连接到所有字符串中一次。不幸的是,您不能使用它来添加空格(strcat 会丢弃 MATLAB 认为是多余的空格)。以下是此用途的语法。

 >> strCell = {'A', 'B'};
 >> strcat(strCell, '_');
 ans =
 A_
 B_

最后,虽然 MATLAB 没有 printf 函数,但您可以通过在fprintf 函数中使用1 作为文件标识符来实现基本相同的功能。格式标识符与 C 中基本相同。

 >> X = 9.2
 >> fprintf(1, '%1.3f\n', X);
 9.200

"9.200" 被打印到屏幕上。与 display 相比,fprintf 很棒,因为您不必对字符串中的所有数字调用 num2str - 只需在需要的位置使用适当的格式标识符即可。

 >> X = 9.2
 >> fprintf(1, 'The value of X is %1.3f meters per second \n', X);
 The value of X is 9.200 meters per second

字符串元胞数组

[编辑 | 编辑源代码]

在许多应用程序中(特别是那些解析文本文件、读取带文本的 Excel 表格等的应用程序),您会遇到字符串元胞数组。

您可以使用 "iscellstr" 函数来判断给定元胞数组中的所有元素是否都是字符串。

 >> notStrCell = {'AA', []};
 >> iscellstr(notStrCell)
 ans = 0

这很有用,因为处理字符串元胞数组的函数如果提供非字符串元胞数组,则会失败。特别是,如果提供的文本文件包含空单元格,它们都会失败,如果提供的元胞数组的任何元素都是空数组([]),这有点令人沮丧。您必须在调用 cellstr 操作函数之前捕获此异常。

可以使用 "strmatch"、"strfind" 和 "regexp" 函数搜索字符串元胞数组。Strmatch 在字符串元胞数组中查找其第一个字符与传递给它的字符串完全匹配的字符串,并返回数组中找到匹配项的所有字符串的索引。如果您给出 ‘exact’ 选项,它只会返回与传递给它的字符串完全相同的元素的索引。例如

 >> strCell = {'Aa', 'AA'};
 >> strmatch('A', strCell);
 ans = 1, 2
 >> strmatch('A', strCell, 'exact');
 ans = []
 >> strmatch('Aa', strCell, 'exact');
 ans = 1

Strfind 在字符串元胞数组中查找特定字符串,但它尝试在每个字符串的任何部分查找它。对于给定字符串元胞数组的每个元素 x,如果在 x 中没有找到匹配项,则它将返回一个空数组,如果找到了对查询的匹配项,则返回 x 中所有匹配项的起始索引(记住,字符串是字符数组)。

 >> strCell = {'Aa', 'AA'};
 >> strfind(strCell, 'A');
 ans = % answer is a cell array with two elements (same size as strCell): 
   1         % Index of the beginning of string "A" in the first cell
   1  2      % Index of each instance of the beginning of string "A" in the second cell
 >> strfind(strCell, 'a');
 ans =
   2
   [] % 'a' is not found

"cellfun" / "isempty" 组合对于识别字符串是否找到非常有用。您可以将 find 函数与这两个函数结合使用以返回找到查询字符串的所有单元格的索引。

 >> strCell = {'Aa', 'AA'};
 >> idxCell = strfind(strCell, 'a');
 >> isFound = ~cellfun('isempty', idxCell); % Returns "0" if idxCell is empty and a "1" otherwise
 >> foundIdx = find(isFound)
 foundIdx = 2

strfind 函数还有一些其他选项,例如仅返回第一个或最后一个匹配项的索引的选项。有关详细信息,请参阅文档。

regexp 函数的工作方式与 strfind 相同,但它不是直接查找字符串,而是使用正则表达式尝试在字符串元胞数组中查找匹配项。正则表达式是查找字符串中模式(不仅仅是字符串中的特定字符串)的强大方法。已经出版了许多关于正则表达式的书籍,因此在这里无法详细介绍。但是,一些好的在线资源包括 regular-expresions.info 和 MATLAB 文档中关于 MATLAB 特定语法的部分。请注意,MATLAB 实现了一些(但并非所有)其他语言(如 Perl)中可用的扩展正则表达式。

不幸的是,MATLAB 本身没有函数来执行其他一些语言中常见的字符串操作,例如字符串分割。但是,在 Google 搜索中很容易找到其中许多函数。

华夏公益教科书