Строки: 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.
Проверьте себя
1. Чем отличаются 'текст' и "текст" в MATLAB?
AНичем
BОдинарные кавычки — char (массив символов), двойные — string
CДвойные кавычки запрещены
DОдинарные — это число
2. Что выведет fprintf('%.2f', 3.14159)?
A3
B3.14
C3.14159
D%.2f
3. Как корректно вставить число 5 в текстовое сообщение?
A'x=' + 5
Bsprintf('x=%d', 5)
C'x=5'+5
D5 + 'x='