В R2016b MATLAB® ввел строковые массивы как тип данных для текста. С R2018b все продукты MathWorks® совместимы со строковыми массивами. Совместимый означает, что, если можно задать текст как вектор символов или массив ячеек из символьных векторов, затем также можно задать его как массив строк. Теперь можно принять строковые массивы как тип данных text в собственном коде.
Если вы пишете код для других пользователей MATLAB, то он должен в ваших интересах обновить ваш API, чтобы принять строковые массивы при поддержании обратной совместимости с другими типами данных text. Принятие строки делает ваш код сопоставимым с Продуктами Mathworks.
Если ваш код имеет немного зависимостей, или если вы разрабатываете новый код, то рассматриваете использование строковых массивов как вашего первичного типа данных text для лучшей эффективности. В этом случае лучшая практика состоит в том, чтобы записать или обновить ваш API, чтобы принять входные параметры, которые являются векторами символов, массивами ячеек из символьных векторов или строковыми массивами.
Для определений массива строк и других условий, смотрите Терминологию для Символьных массивов и Строковых массивов.
В MATLAB можно хранить текстовые данные двумя способами. Один путь состоит в том, чтобы использовать символьный массив, который является последовательностью символов, как числовой массив является последовательностью чисел. Или, начиная в R2016b, другой путь состоит в том, чтобы сохранить последовательность символов в строке. Можно сохранить несколько строк в массиве строк. Для получения дополнительной информации см. Символы и строки.
Когда ваш код имеет много зависимостей, и необходимо обеспечить обратную совместимость, следовать за этими подходами для обновления функций и классов, чтобы представить совместимый API.
Примите строковые массивы как входные параметры.
Если входной параметр может быть или вектором символов или массивом ячеек из символьных векторов, затем обновить ваш код так, чтобы аргумент также мог быть массивом строк. Например, рассмотрите функцию, которая имеет входной параметр, который можно задать как вектор символов (использующий одинарные кавычки). Лучшая практика состоит в том, чтобы обновить функцию так, чтобы аргумент мог быть задан или как вектор символов или как строковый скаляр (использующий двойные кавычки).
Примите строки и как имена и как значения в аргументах пары "имя-значение".
В аргументах пары "имя-значение" позвольте именам быть заданными или как векторы символов или как строки — то есть, или с одинарными или двойными кавычками вокруг имени. Если значение может быть вектором символов или массивом ячеек из символьных векторов, затем обновить ваш код так, чтобы это также мог быть массив строк.
Не принимайте массивы ячеек строковых массивов для аргументов ввода текста.
Массив ячеек строковых массивов имеет массив строк в каждой ячейке. Например, {"hello","world"}
массив ячеек строковых массивов. В то время как можно создать такой массив ячеек, он не рекомендуется для хранения текста. Элементы массива строк имеют совпадающий тип данных и хранятся эффективно. Если вы храните строки в массиве ячеек, то вы теряете преимущества использования массива строк.
Однако, если ваш код принимает неоднородные массивы ячеек как входные параметры, то рассмотрите массивы ячеек принятия, которые содержат строки. Можно преобразовать любые строки в таком массиве ячеек к векторам символов.
В общем случае не изменяйте выходной тип.
Если ваша функция возвращает вектор символов или массив ячеек из символьных векторов, то не изменяйте выходной тип, даже если функция принимает строковые массивы как входные параметры. Например, fileread
функция принимает входное имя файла, заданное или как вектор символов или как строку, но функция возвращает содержимое файла как вектор символов. Путем хранения выхода вводят то же самое, можно обеспечить обратную совместимость.
Возвратите совпадающий тип данных, когда функция изменит входной текст.
Если ваша функция изменяет входной текст и возвращает модифицированный текст как выходной аргумент, то аргументы ввода и вывода должны иметь совпадающий тип данных. Например, lower
функция принимает текст как входной параметр, преобразует его во все строчные буквы и возвращает его. Если входной параметр является вектором символов, то lower
возвращает вектор символов. Если вход является массивом строк, то lower
возвращает массив строк.
Рассмотрите добавление 'TextType'
аргумент, чтобы импортировать функции.
Если ваша функция импортирует данные из файлов, и по крайней мере некоторые из тех данных могут быть текстом, то рассмотреть добавление входного параметра, который задает, возвратить ли текст как символьный массив или массив строк. Например, readtable
функция обеспечивает 'TextType'
аргумент пары "имя-значение". Этот аргумент задает ли readtable
возвращает таблицу с текстом в массивах ячеек из символьных векторов или строковых массивах.
Обработайте методы как функции.
Для принятия строки обработайте методы, как будто они - функции. Примите строковые массивы как входные параметры, и в целом, не изменяйте тип данных выходных аргументов, как описано в предыдущем разделе.
Не изменяйте типы данных свойств.
Если свойство является вектором символов или массивом ячеек из символьных векторов, то не изменяйте его тип. Когда вы получаете доступ к такому свойству, значение, которое возвращено, является все еще вектором символов или массивом ячеек из символьных векторов.
Как альтернатива, можно добавить новое свойство, которое является строкой, и сделайте его зависящим от старого свойства обеспечить совместимость.
Установите свойства с помощью строковых массивов.
Если можно установить свойство с помощью вектора символов или массива ячеек из символьных векторов, затем обновить класс, чтобы установить то свойство с помощью массива строк также. Однако не изменяйте тип данных свойства. Вместо этого преобразуйте массив входной строки в тип данных свойства, и затем установите свойство.
Добавьте a string
метод.
Если ваш класс уже имеет a char
и/или a cellstr
метод, затем добавьте a string
метод. Если можно представлять объект класса как вектор символов или массив ячеек из символьных векторов, то представляйте его как массив строк также.
Можно принять строки в старых API путем принятия строковых массивов как входные параметры, и затем преобразования их в векторы символов или массивы ячеек из символьных векторов. Если вы выполняете такое преобразование в начале функции, то вы не должны обновлять остальную часть его.
convertStringsToChars
функция обеспечивает способ обработать все входные параметры, преобразовывая только те аргументы, которые являются строковыми массивами. Чтобы позволить вашему существующему коду принять строковые массивы как входные параметры, добавьте вызов convertStringsToChars
в начале ваших функций и методов.
Например, если вы задали функциональный myFunc
это принимает три входных параметра, процесс все три входных использования convertStringsToChars
. Оставьте остальную часть вашего кода неизменной.
function y = myFunc(a,b,c) [a,b,c] = convertStringsToChars(a,b,c); <line 1 of original code> <line 2 of original code> ...
В этом примере, аргументах [a,b,c]
перезапишите входные параметры на месте. Если какой-либо входной параметр не является массивом строк, то это неизменно.
Если myFunc
принимает переменное количество входных параметров, затем процесс все аргументы, заданные varargin
.
function y = myFunc(varargin) [varargin{:}] = convertStringsToChars(varargin{:}); ...
Факторы эффективности
convertStringsToChars
функция более эффективна при преобразовании одного входного параметра. Если ваша функция является чувствительной эффективностью, то можно преобразовать входные параметры по одному при тихом оставлении остальной части кода неизменной.
function y = myFunc(a,b,c) a = convertStringsToChars(a); b = convertStringsToChars(b); c = convertStringsToChars(c); ...
Когда ваш код имеет немного зависимостей, или вы разрабатываете совершенно новый код, рассматриваете использование массивов строк как первичного типа данных text. Строковые массивы обеспечивают хорошую эффективность и эффективное использование памяти при работе с большими суммами текста. В отличие от массивов ячеек из символьных векторов, строковые массивы имеют тип гомогенных данных. Строковые массивы облегчают писать удобный в сопровождении код. Чтобы использовать строковые массивы при поддержании обратной совместимости к другим типам данных text, следуйте за этими подходами.
Примите любые типы данных text как входные параметры.
Если входной параметр может быть массивом строк, то также позволяют ему быть вектором символов или массивом ячеек из символьных векторов.
Примите символьные массивы и как имена и как значения в аргументах пары "имя-значение".
В аргументах пары "имя-значение" позвольте именам быть заданными или как векторы символов или как строки — то есть, или с одинарными или двойными кавычками вокруг имени. Если значение может быть массивом строк, то также позволяют ему быть вектором символов или массивом ячеек из символьных векторов.
Не принимайте массивы ячеек строковых массивов для аргументов ввода текста.
Массив ячеек строковых массивов имеет массив строк в каждой ячейке. В то время как можно создать такой массив ячеек, он не рекомендуется для хранения текста. Если ваши строки использования кода как первичный тип данных text, сохраните несколько частей текста в массиве строк, не массив ячеек строковых массивов.
Однако, если ваш код принимает неоднородные массивы ячеек как входные параметры, то рассмотрите массивы ячеек принятия, которые содержат строки.
В общем случае возвращаемые строки.
Если ваша функция возвращает выходные аргументы, которые являются текстом, то возвращают их как строковые массивы.
Возвратите совпадающий тип данных, когда функция изменит входной текст.
Если ваша функция изменяет входной текст и возвращает модифицированный текст как выходной аргумент, то аргументы ввода и вывода должны иметь совпадающий тип данных.
Обработайте методы как функции.
Примите векторы символов и массивы ячеек из символьных векторов как входные параметры, как описано в предыдущем разделе. В общем случае возвращаемые строки как выходные параметры.
Задайте свойства как строковые массивы.
Если свойство содержит текст, то установленный свойство с помощью массива строк. Когда вы получаете доступ к свойству, возвращаете значение как массив строк.
Когда вы пишете новый код или изменяете код, чтобы использовать строковые массивы в качестве первичного типа данных text, обеспечить обратную совместимость с другими типами данных text. Можно принять векторы символов или массивы ячеек из символьных векторов как входные параметры, и затем сразу преобразовать их в строковые массивы. Если вы выполняете такое преобразование в начале функции, то остальная часть вашего кода может использовать строковые массивы только.
convertCharsToStrings
функция обеспечивает способ обработать все входные параметры, преобразовывая только те аргументы, которые являются векторами символов или массивами ячеек из символьных векторов. Чтобы позволить вашему новому коду принять эти типы данных text как входные параметры, добавьте вызов convertCharsToStrings
в начале ваших функций и методов.
Например, если вы задали функциональный myFunc
это принимает три входных параметра, процесс все три входных использования convertCharsToStrings
.
function y = myFunc(a,b,c) [a,b,c] = convertCharsToStrings(a,b,c); <line 1 of original code> <line 2 of original code> ...
В этом примере, аргументах [a,b,c]
перезапишите входные параметры на месте. Если какой-либо входной параметр не является вектором символов или массивом ячеек из символьных векторов, то это неизменно.
Если myFunc
принимает переменное количество входных параметров, затем процесс все аргументы, заданные varargin
.
function y = myFunc(varargin) [varargin{:}] = convertCharsToStrings(varargin{:}); ...
Факторы эффективности
convertCharsToStrings
функция более эффективна при преобразовании одного входного параметра. Если ваша функция является чувствительной эффективностью, то можно преобразовать входные параметры по одному при тихом оставлении остальной части кода неизменной.
function y = myFunc(a,b,c) a = convertCharsToStrings(a); b = convertCharsToStrings(b); c = convertCharsToStrings(c); ...
Если это вообще возможно, избегайте ручного преобразования входных параметров, которые содержат текст, и вместо этого используют convertStringsToChars
или convertCharsToStrings
функции. Проверка типов данных входных параметров и преобразование их самостоятельно являются утомительным подходом, подверженным ошибкам.
Если необходимо преобразовать входные параметры, то используйте функции в этой таблице.
Чтобы проверять тип данных входного параметра, который мог содержать текст, рассмотрите использование шаблонов, показанных в этой таблице.
Необходимый тип входного параметра | Старая проверка | Новая проверка |
---|---|---|
Вектор символов или строковый скаляр |
|
|
| ||
Вектор символов или строковый скаляр |
|
|
Непустой вектор символов или строковый скаляр |
|
|
| ||
Массив ячеек из символьных векторов или массив строк |
|
|
Любой тип данных text |
|
|
Пустая строка является строкой без символов. MATLAB отображает пустую строку как пару двойных кавычек ни с чем между ними (""
). Однако пустая строка является все еще массивом строк 1 на 1. Это не пустой массив.
Рекомендуемый способ проверять, пуста ли строка, состоит в том, чтобы использовать strlength
функция.
str = "";
tf = (strlength(str) ~= 0)
Примечание
Не используйте isempty
функционируйте, чтобы проверять на пустую строку. Пустая строка не имеет никаких символов, но является все еще массивом строк 1 на 1.
strlength
функция возвращает длину каждой строки в массиве строк. Если строка должна быть строковым скаляром, и также не пустая, то проверяйте на оба условия.
tf = (isStringScalar(str) && strlength(str) ~= 0)
Если str
мог быть или вектор символов или строковый скаляр, затем все еще можно использовать strlength
определить его длину. strlength
возвращает 0
если входной параметр является пустым символьным вектором (''
).
tf = ((ischar(str) || isStringScalar(str)) && strlength(str) ~= 0)
Массив пустой строки является, на самом деле, пустым массивом — то есть, массив, который имеет по крайней мере одну размерность, длиной которой является 0
.
Рекомендуемый способ создать массив пустой строки состоит в том, чтобы использовать strings
функция, задавая 0
как по крайней мере один из входных параметров. isempty
функция возвращает 1
когда вход является массивом пустой строки.
str = strings(0); tf = isempty(str)
strlength
функция возвращает числовой массив, который одного размера с массивом входной строки. Если вход является массивом пустой строки, то strlength
возвращает пустой массив.
str = strings(0); L = strlength(str)
Строковые массивы также могут содержать отсутствующие строки. Отсутствующая строка является строкой, эквивалентной NaN
для числовых массивов. Это указывает, где массив строк имеет отсутствующие значения. Отсутствующая строка отображается как <missing>
, без кавычек.
Можно создать отсутствующие строки с помощью missing
функция. Рекомендуемый способ проверять на отсутствующие строки состоит в том, чтобы использовать ismissing
функция.
str = string(missing); tf = ismissing(str)
Примечание
Не проверяйте на отсутствующие строки путем сравнения строки с отсутствующей строкой.
Отсутствующая строка не равна себе, так же, как NaN
не равно себе.
str = string(missing); f = (str == missing)
Документация MathWorks использует эти термины, чтобы описать символьные массивы и строковые массивы. Для непротиворечивости используйте эти термины в своей собственной документации, сообщениях об ошибке и предупреждениях.
Вектор символов — 1
- n
массив символов, типа данных char
.
Символьный массив — m
- n
массив символов, типа данных char
.
Массив ячеек из символьных векторов Массив ячеек, в котором каждая ячейка содержит вектор символов.
Строка или строковый скаляр — 1
- 1
массив строк. Строковый скаляр может содержать 1
- n
последовательность символов, но самостоятельно один объект. Используйте термины "строковый скаляр" и "вектор символов" друг вместе с другом, когда быть точными о размере и типе данных. В противном случае можно использовать термин "строка" в описаниях.
Вектор строки — 1
- n
или n
- 1
массив строк. Если только один размер возможен, то используйте его в своем описании. Например, используйте "1
- n
массив строк", чтобы описать массив того размера.
Массив строк — m
- n
массив строк.
Пустая строка — Строковый скаляр, который не имеет никаких символов.
Массив пустой строки — Массив строк по крайней мере с одной размерностью, размером которой является 0
.
Отсутствующая строка — Строковый скаляр, который является отсутствующим значением (отображения как <missing>
).
cellstr
| char
| convertCharsToStrings
| convertContainedStringsToChars
| convertStringsToChars
| iscellstr
| ischar
| isstring
| isStringScalar
| string
| strings
| strlength
| validateattributes