Строки: char, string и форматный вывод
Два типа текста в MATLAB, их различие и как красиво выводить числа и строки.
В MATLAB есть char (символьный массив в одинарных кавычках) и более новый тип string (в двойных кавычках).
Два типа текста
Исторически текст в MATLAB — это массив символов char, заданный одинарными кавычками: 'привет' технически вектор-строка из символов. С версии R2016b появился тип string в двойных кавычках — он удобнее: ведёт себя как единое значение, а не как массив букв. В новом коде предпочитают string, но char по-прежнему всюду в старых программах.
c = 'hello'; % char, массив из 5 символов
s = "hello"; % string, единое значение
length(c) % 5 — длина массива символов
strlength(s) % 5 — длина строки
Склейка текста
Символьные массивы склеивают как обычные векторы — через квадратные скобки. Строки string складывают оператором + или функцией strcat. Для аккуратной сборки текста с числами лучше всего подходит sprintf.
first = 'Ada';
full = ['Hello, ' first '!']; % char-конкатенация
% full = 'Hello, Ada!'
name = "Ada";
greet = "Hi, " + name; % string через +
Форматирование чисел
Функция sprintf (в строку) и fprintf (на экран) форматируют значения по шаблону, как в языке C: %d — целое, %f — дробное, %.2f — два знака после запятой, %s — строка, \n — перевод строки. Это рабочая лошадка любого вывода результатов.
x = 3.14159;
fprintf('Pi приблизительно %.3f\n', x);
msg = sprintf('Значение: %d', 42); % 'Значение: 42'
Вывод:
Pi приблизительно 3.142
Полезные функции над текстом
| Функция | Что делает |
upper/lower | регистр |
strrep | замена подстроки |
split/strsplit | разбить по разделителю |
contains | есть ли подстрока |
num2str/str2double | число ⇄ текст |
Как работает под капотом
Раз char — это массив символов, привычные матричные операции работают и над текстом: c(1) — первая буква, c(end:-1:1) — строка задом наперёд, сравнение c == 'l' даёт логическую маску совпадений. Тип string устроен иначе: это контейнер, и индексация s(1) вернёт всю строку целиком, а не первую букву. Смешивать эти модели — частый источник путаницы при переходе со старого кода на новый.
Частые ошибки
- Путать кавычки: одинарные дают
char, двойные —string, и они ведут себя по-разному. - Складывать число и текст напрямую (
'x=' + 5) — для char это сложит коды символов. Нуженnum2strилиsprintf. - Индексировать
stringкак массив символов и удивляться результату.
Массивы строк и обработка текстовых данных
Тип string хорош тем, что из строк можно собирать настоящие массивы: names = ["Ada"; "Bob"; "Cleo"] — это вектор из трёх строк, а не мешанина символов. Над таким массивом работают векторизованные строковые функции: upper(names) переведёт все в верхний регистр разом, contains(names, "o") вернёт логическую маску, strlength(names) — вектор длин. Это та же векторизация, что и для чисел, только над текстом. Для разбора структурированных текстовых данных (логов, CSV-полей) есть split, extractBetween, regexp для регулярных выражений. Старый тип char так не умеет — массивы символов разной длины в нём приходится хранить в cell-массиве, что гораздо неуклюже.
Преобразования число — текст
На стыке чисел и текста постоянно нужны преобразования, и важно не путать их направления. num2str и string превращают число в текст для вывода или подписи графика; str2double и str2num делают обратное — разбирают текст в число (например, прочитанное из файла поле). Типичная ошибка новичка — попытаться выполнить арифметику над текстом, прочитанным из файла, забыв преобразовать его в число: '10' + '5' для char сложит коды символов, а не даст 15. Чёткое разделение «где у меня число, а где его текстовое представление» избавляет от множества загадочных багов при работе с данными.
Итоги
char(одинарные кавычки) — массив символов,string(двойные) — единое значение.sprintf/fprintfформатируют по C-шаблонам (%d,%.2f,\n).- Число с текстом соединяйте через
num2strилиsprintf, не через+для char.