如何在 Matlab 中将多行分配给字符串变量

How to assign multiple lines to a string variable in Matlab

我有几行这样的文字:

abc
def
ghi

并且我想将这些多行分配给一个 Matlab 变量以供进一步处理。

我正在从非常大的文本文件中复制这些内容,并希望在 Matlab 中对其进行处理,而不是将文本保存到文件中,然后逐行读取以进行处理。

我试图将上述文本行作为单个字符串处理,但在尝试分配给变量时出现错误:

x = 'abc
def
ghi'

错误:

x = 'abc
        |
Error: String is not terminated properly.

任何可以帮助我理解和解决问题的建议将不胜感激。

您的错误是因为您在 MATLAB 需要结束引号字符时结束了该行。您必须使用数组表示法才能拥有 multi-line 或 multi-element 数组。


如果你使用数组表示法,你可以这样赋值

x = ['abc'
     'def'
     'hij']
>> x = 3×3 char array

注意:使用此方法,您的行必须具有相同数量的字符,因为您实际上是在处理 character array。您可以将字符数组想象成数字矩阵,因此它必须是 "rectangular".

如果您有 MATLAB R2016b 或更新版本,则可以使用 string 数据类型。这里使用双引号"..."而不是单引号'...',可以是multi-line。您仍然必须使用数组表示法:

x = ["abc"
     "def"
     "hijk"]
>> x = 3×1 string array

每一行中可以有不同数量的字符,因为这只是一个 3 元素字符串数组,而不是字符数组。

或者,使用字符数组(或字符串)的元胞数组

x = {'abc'
     'def'
     'hijk'}
>> x = 3×1 cell array

同样,您可以在元胞数组中包含不同长度的字符数组或字符串。


在上述所有示例中,换行符只是为了提高可读性,可以用 semi-colon ; 代替以表示数组的下一行。


您选择的选项将取决于您要对文本执行的操作。如果您正在从文件中读取数据,我会建议使用字符串数组或元胞数组,因为它们可以处理不同长度的行。为了向后兼容,请使用元胞数组。您可能会发现 cellfun 与元胞数组操作相关。对于本机字符串操作,请使用字符串数组。

我经常这样做,即将我想 hard-code 的其他地方的文本复制到 MATLAB 脚本中(在我的例子中,它通常是我想从 MATLAB 操作和调用的 SQL 代码)。

为了实现这一点,我在 clipboard2cellstr.m 中定义了一个辅助函数,定义如下:

function clipboard2cellstr

str = clipboard('paste');
str = regexprep(str, '''', ''''''); % Double any single quotes
strs = regexp(str, '\s*\r?\n\r?', 'split');
cs = sprintf('{\n''%s''\n}', strjoin(strs, sprintf('''\n''')));
clipboard('copy', cs);
disp(cs)
disp('(Copied to Clipboard)')

end

然后我使用 Ctrl-c(或然而)和 运行 clipboard2cellstr 复制文本。这会将剪贴板的内容更改为我可以使用 Ctrl-v(或然而)粘贴到 MATLAB 编辑器中的内容。

例如复制这一行

和这一行

和这个,然后 运行ning 函数生成这个:

{
'For example, copying this line'
'and this line'
'and this one, and then running the function generates this:'
}

这是有效的 MATLAB,可以直接粘贴进去。