exponenta event banner

Часто задаваемые вопросы о строковых массивах

MATLAB ® представил string тип данных в R2016b. Начиная с R2018b, можно использовать массивы строк для работы с текстом в продуктах MathWorks ®. В строковых массивах хранятся фрагменты текста и предоставляется набор функций для работы с текстом в качестве данных. Массивы строк можно индексировать в массивы, изменять их форму и конкатенировать с массивами любого другого типа. Дополнительные сведения см. в разделе Создание массивов строк.

В большинстве случаев массивы строк ведут себя подобно векторам символов и массивам ячеек векторов символов. Однако существует несколько ключевых различий между строковыми массивами и символьными массивами, которые могут привести к нежелательным результатам. Для каждого из этих различий рекомендуется использовать строки, которые приводят к ожидаемому результату.

Почему использование командной формы со строками возвращает ошибку?

При использовании таких функций, как cd, dir, copyfile, или load функции в командной форме, избегайте использования двойных кавычек. В командной форме аргументы, заключенные в двойные кавычки, могут привести к ошибкам. Чтобы указать аргументы как строки, используйте функциональную форму.

В синтаксисе команд входные данные разделяются пробелами, а не запятыми, и входные аргументы не включаются в круглые скобки. Например, можно использовать cd с синтаксисом команды для изменения папок.

cd C:\Temp

Текст C:\Temp - символьный вектор. В командной форме все аргументы всегда являются символьными векторами. Если имеется аргумент, например имя папки, содержащий пробелы, укажите его как один входной аргумент, заключив в отдельные кавычки.

cd 'C:\Program Files'

Но если указать аргумент с помощью двойных кавычек, то cd выдает ошибку.

cd "C:\Program Files"
Error using cd
Too many input arguments.

Сообщение об ошибке может варьироваться в зависимости от используемой функции и указанных аргументов. Например, при использовании load функция с синтаксисом команды и укажите аргумент с помощью двойных кавычек, затем load выдает другую ошибку.

load "myVariables.mat"
Error using load
Unable to read file '"myVariables.mat"': Invalid argument.

В форме команды двойные кавычки рассматриваются как часть литерального текста, а не как оператор построения строки. Если вы написали эквивалент cd "C:\Program Files" в функциональной форме, то это будет выглядеть как звонок cd с двумя аргументами.

cd('"C:\Program','Files"')

При указании аргументов в качестве строк используйте синтаксис функции. Все функции, поддерживающие синтаксис команд, также поддерживают синтаксис функций. Например, можно использовать cd с синтаксисом функции и входными аргументами, представляющими собой строки с двойными кавычками.

cd("C:\Program Files")

Почему строки в массивах ячеек возвращают ошибку?

При наличии нескольких строк сохраните их в строковом массиве, а не в массиве ячеек. Создание массива строк в квадратных скобках, а не фигурных скобках. Строковые массивы более эффективны, чем массивы ячеек, для хранения и обработки текста.

str = ["Venus","Earth","Mars"]
str = 1×3 string array
    "Venus"    "Earth"    "Mars"

Избегайте использования массивов ячеек строк. При использовании массивов ячеек вы отказываетесь от преимуществ производительности, связанных с использованием массивов строк. И на самом деле, большинство функций не принимают массивы ячеек строк в качестве входных аргументов, опций или значений пар имя-значение. Например, если в качестве входного аргумента указан массив строк ячейки, то contains функция выдает ошибку.

C = {"Venus","Earth","Mars"}
C = 1×3 cell array
    {["Venus"]}    {["Earth"]}    {["Mars"]}
TF = contains(C,"Earth")
Error using contains
First argument must be a string array, character vector, or cell array of character vectors.

Вместо этого укажите аргумент в виде строкового массива.

str = ["Venus","Earth","Mars"];
TF = contains(str,"Earth");

Перед R2016b термин «клеточный массив строк» означал клеточный массив, все элементы которого содержат символьные векторы. Но точнее называть такие массивы ячейками как «массивы ячеек символьных векторов», чтобы отличать их от строковых массивов.

Массивы ячеек могут содержать переменные, имеющие любые типы данных, включая строки. По-прежнему можно создать массив ячеек, все элементы которого содержат строки. И если в коде уже указаны массивы ячеек символьных векторов, то замена одиночных кавычек двойными кавычками может показаться простым обновлением. Однако создавать или использовать массивы ячеек строк не рекомендуется.

Почему делает length() возврата строки 1?

Обычно используется length для определения количества символов в символьном векторе. Но чтобы определить количество символов в строке, используйте strlength функция, не length.

Создайте вектор символов, используя одинарные кавычки. Чтобы определить его длину, используйте функцию длины. Поскольку C - вектор, его длина равна количеству символов. C является вектором 1 на 11.

C = 'Hello world';
L = length(C)
L = 11

Создайте строку с одинаковыми символами, используя двойные кавычки. Хотя в ней хранится 11 символов, str является строковым массивом 1 на 1 или строковым скаляром. Если для строкового скаляра вызывается длина, то выходной аргумент будет 1, независимо от того, сколько персонажей оно хранит.

str = "Hello World";
L = length(str)
L = 1

Чтобы определить количество символов в строке, используйте strlength функция, введенная в R2016b. Для совместимости, strlength также работает с символьными векторами. В обоих случаях strlength возвращает количество символов.

L = strlength(C)
L = 11
L = strlength(str)
L = 11

Вы также можете использовать strlength на строковых массивах, содержащих несколько строк, и на клеточных массивах символьных векторов.

length функция возвращает размер самого длинного измерения массива. Для строкового массива: length возвращает число строк вдоль самого длинного измерения массива. Он не возвращает количество символов в строках.

Почему делает isempty("") Вернуть 0?

Строка не может содержать никаких символов. Такая строка является пустой строкой. Пустую строку можно указать с помощью пустой пары двойных кавычек.

L = strlength("")
L = 0

Однако пустая строка не является пустым массивом. Пустая строка - это строковый скаляр, не содержащий символов.

sz = size("")
sz = 1×2    
     1     1

При звонке isempty на пустой строке, затем возвращается 0 (false), поскольку строка не является пустым массивом.

tf = isempty("")
tf = logical
   0

Однако, если вы звоните isempty на пустом символьном массиве, затем он возвращает 1 (true). Символьный массив, указанный как пустая пара одиночных кавычек, '', является массивом символов 0 на 0.

tf = isempty('')
tf = logical
   1

Чтобы проверить, не содержит ли фрагмент текста символов, рекомендуется использовать strlength функция. Можно использовать тот же вызов, независимо от того, является ли ввод строковым скаляром или символьным вектором.

str = "";
if strlength(str) == 0
    disp('String has no text')
end
String has no text
chr = '';
if strlength(chr) == 0
    disp('Character vector has no text')
end
Character vector has no text

Почему добавление строк с помощью квадратных скобок возвращает несколько строк?

К вектору символов можно добавить текст, заключив его в квадратные скобки. Но если добавить текст в строковый массив, используя квадратные скобки, то новый текст будет объединен как новые элементы строкового массива. Чтобы добавить текст в строки, используйте plus оператор или strcat функция.

Например, если объединить две строки, то результатом будет массив строк 1 на 2.

str = ["Hello" "World"]
str = 1×2 string array
    "Hello"    "World"

Однако при объединении двух символьных векторов получается более длинный символьный вектор.

str = ['Hello' 'World']
chr = 'HelloWorld'

Чтобы добавить текст к строке (или к элементам массива строк), используйте plus оператор вместо квадратных скобок.

str = "Hello" + "World"
str = "HelloWorld"

В качестве альтернативы можно использовать strcat функция. strcat добавляет текст, независимо от того, являются ли входные аргументы строками или символьными векторами.

str = strcat("Hello","World")
str = "HelloWorld"

Используйте ли вы квадратные скобки, plus, или strcat, можно указать произвольное число аргументов. Добавление пробела между Hello и World.

str = "Hello" + " " + "World"
str = "Hello World"

См. также

| | | | | | | | | | | |

Связанные темы