罗兰谈MATLAB的艺术

将想法转化为MATLAB

在代码中接受字符串输入

今天我想介绍一位客座博主Stephen Doe,他在MathWorks的MATLAB文档团队工作。在今天的文章中,Stephen讨论了如何以及为什么要更新代码以接受字符串数组作为输入。

内容

什么是字符串?

在R2016b中,MATLAB®引入了字符串数据类型作为文本的新数据类型。字符串数组的每个元素都存储一个字符序列。您可以在字符串数组上使用标准数组索引和操作,以及R2016b中引入的字符串操作函数。此外,您还可以使用许多MATLAB函数(例如排序独特的)在字符串数组上。

这里有一个简短的例子。从可以存储为一个字符串或字符串的文本开始标量,我们用来描述只有一个元素的字符串数组的术语。从R2017a开始,可以使用双引号创建字符串。(单引号仍然创建一个字符向量。)

str =“一匹马!一匹马!用我的王国换一匹马!”
str = "一匹马! "一匹马!用我的王国换一匹马!”

如果你使用分裂函数将该字符串拆分为空格字符,则结果是一个包含9个元素的字符串数组。得到的不是单元格数组,而是存储文本的同构数组——与开始时的数据类型相同的数组。的分裂函数以列向量的形式返回字符串数组。让我们将其重塑为字符串的行向量,以便更紧凑地显示。

STR = split(STR);STR = STR '
str = 1×9字符串数组列1到8 "A" "马!"“a”“马!”"我的" "王国" "换" "一匹"第九纵队"的马!"

字符串数组现在提供了一种强大的方法来处理数据中的文本。当您在字符串数组中处理文本时,您永远不必求助于单元格数组或花括号索引。我不会赘述这一点,因为Loren已经发表了一些关于使用字符串数组的精彩客座文章。如果你正在寻找更多使用字符串的例子,请参阅:字符串数组介绍《弦乐之歌,在MATLAB中使用文本

当然,你可以在这里找到字符串数组的文档字符和字符串

公共服务公告!

前几段,我说过“许多”MATLAB函数现在接受字符串数组作为输入参数。事实上,在未来的版本中,几乎所有MathWorks®产品都将使用字符串数组作为输入。下载188bet金宝搏

以下是当我们说一个产品“使用”字符串数组作为输入时的意思:

  • 如果输入参数可以是一段文本,那么可以将其指定为字符向量作为字符串标量。也就是说,您可以使用单引号或双引号。
  • 如果输入参数可以包含多个文本片段,则可以将其指定为字符向量的单元格数组作为一个字符串数组。

我们在旧函数中坚持这种模式,我们在其中添加了对字符串数组的支持,在未来的新函数中也是如此。金宝app考虑到分裂函数,我用来分割字符串。它在字符向量或字符向量的单元格数组上工作得和在字符串上一样好。(注意在以前的版本中总是返回字符向量的函数,例如fileread函数,将继续这样做的兼容性。)

我们认为这种方法是在整个产品中支持使用字符串数组的最无缝的方式。下载188bet金宝搏金宝app我们的建议是在您自己的代码中采用相同的方法。如果您维护自己的代码,或者为其他MATLAB用户编写代码,那么更新代码以接受字符串数组作为输入,同时保持对存储文本的旧类型的支持,这对您是有利的。金宝app

如何让你的代码与字符串工作

现在,你在想,“太好了!但我该怎么做呢?”(好吧,也许“伟大”并不是我想到的确切词。)

为了帮助您更新代码,R2018a文档提供了指导方针更新代码以接受字符串.现在可以将这些指导原则应用到代码中。指南和我们的文档还提供了到辅助函数的链接,例如convertStringsToChars,这为在代码中接受字符串铺平了道路。

下面是一个简短的示例,展示了将这些指导方针付诸行动的两种方法。我将从一个使用我们的helper函数的快速而简单的方法开始。然后我将用另一种方法,它会更花时间,但也更有前瞻性。

假设这段代码是最初的函数,使用城市名称的前三个字母缩写,使这些字母大写。到目前为止,您已经将城市名称指定为字符向量。例如,如果输入参数为“波士顿”,则输出参数为“bo”

函数abr =缩写atename (str) abr = upper(str(1:3));结束

如果您的用户指定字符串“波士顿”作为输入参数,则会出现语法错误。对于字符串数组,语法str (1:3)表示以三元素字符串数组的形式返回第一个、第二个和第三个字符串。但“波士顿”它本身就是一个1乘1的字符串数组!

同时支持字符向量和字符金宝app串的一种方法是使用helper函数convertStringsToChars在原始代码的开头。convertStringsToChars处理任意数量的输入参数,如果其中有字符串,则转换它们。它不影响所有其他数据类型。

函数abr =缩写atename (str) str = convertStringsToChars(str);Abr = upper(str(1:3));结束

使用helper函数,您可以接受输入字符串数组,而无需更改后面的任何代码。此外,输出参数类型与原始代码返回的类型没有区别。

第二种方法是使用一个新的文本操作函数,例如extractBefore.这些新函数也适用于字符向量和字符向量的单元格数组。所以,这个新版本的abbreviateName对于任何文本数据类型的输入都以相同的方式工作。

函数abr =缩写atename (str) abr = extractBefore(str,4);Abr =上(Abr);结束

虽然这段代码同时支持字符串和字符金宝app向量,但我不得不重写这段代码。此外,如果输入是字符串,这段代码将返回一个字符串。原始代码总是返回一个字符向量。

牵线搭桥

哪条路对你来说是正确的?这就是"选择你自己的冒险"的部分。如果您在文本方面做了大量工作,那么可能是时候深入研究您的代码并重写其内部以使用字符串数组。如果没有,那就使用convertStringsToChars并最大限度地减少更新代码的痛苦。无论选择哪一条路,都要寻求我们的帮助的指导方针

如果你对字符串数组有什么想说的,或者你想更新自己的代码,请告诉我们在这里




发布与MATLAB®R2018a

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。