Урок 18. Работа с символьными данными

1. Урок 18. Работа с символьными данными

 

Урок №18.

Работа с символьными данными

  • Основные функции символьных данных

  • Операции над строками

  • Преобразование символов и строк

  • Функции преобразования систем счисления

  • Вычисление строковых выражений

Функции обработки массивов символов или рядов этих массивов (строкой в терминологии MATLAB называется любой массив символов или ряд массива символов) для математической системы могут показаться второстепенными. Однако это не так. Строковое представление данных лежит в основе символьной математики, арифметики произвольной точности и многочисленных программных конструкций, не говоря уже о том, что оно широко применяется в базах данных и массивах ячеек. Этот урок посвящен возможностям обработки символьных переменных и выражений в системе MATLAB.

 

2. Основные функции символьных данных

 

Основные функции символьных данных

В основе представления символов в строках лежит их кодирование с помощью сменных таблиц кодов. Такие таблицы ставят в однозначное соответствие каждому символу некоторый код со значением от 0 до 255.

Вектор, содержащий строку символов, в системе MATLAB задается следующим образом:

  • S= 'Any Characters' — вектор, компонентами которого являются числовые коды, соответствующие символам [ Символ  внутри такой строки дублируется (заменяется на ''). — Примеч. ред. ].

Первые 127 чисел — это коды ASCII, представляющие буквы латинского языка, цифры и спецзнаки. Они образуют основную таблицу кодов. Вторая таблица (коды от 128 до 255) является дополнительной и может использоваться для представления символов других языков, например русского. Длина вектора S соответствует числу символов в строке, включая пробелы. Апостроф внутри строки символов должен вводиться как два апострофа ' '.

К основным строковым функциям относятся следующие:

  • char (X) — преобразует массив X положительных целых чисел (числовых кодов от 0 до 65 535) в массив символов системы MATLAB (причем только первые 127 кодов — английский набор ASCII, со 128 до 255 — расширенный набор ASCII) и возвращает его, на платформе Windows при значении выше 65 535 выдает предупреждение об ошибке, но возвращает русскую букву я (я повторяется так же, как char(255+256rt), где п — целые неотрицательные числа) [ Результат char(x) при х>65535 зависит от платформы, русификации и т. д. — Примеч. ред. ];

Пример:

» X=reshape(32:127,32,3); 

» S= char(X')

S=

!"#$*&'()*+.-./0123456789::<=>? 

(aABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_

 "abcdefghijklmnopqrstuvwxyz{|}-[]

» t1= ' computer'

» t2='for';

» t3='home':

» t4='users':

» S = Char(tl.t2.t3.t4)

S =

computer

for

home

users

  • char (С) — преобразует каждый элемент строкового массива ячеек в ряды массива символов, если строки массива ячеек разного размера, к ним в конце добавляются пробелы (осуществляется набивка (padding) в терминах MATLAB) так чтобы в каждом ряде массива символов было одинаковое число символов;

  • char (Tl, T2, ТЗ), где Т — строки, возвращает массив символов, при этом копии строк T1, T2, Т3 преобразуются в ряды массива символов добавлением при необходимости пробелов в конце рядов массивов символов, как описано ранее;char (java.Tang.string) — преобразует объект класса java.lang. string вмассив символов MATLAB;

  • char (javaarray of java.lang.string) — единственный случай, когда выходным аргументом функции является не массив символов, а строковый массив ячеек, в который преобразуется массив строк Java;

  • double(S) — преобразует символы строки S в числовые коды 0—65535 и возвращает вектор с этими числовыми кодами;

  • ischar'(S) — возвращает логическую единицу, если S является символьной переменной, и логический ноль в противном случае;

  • deblank(str) — возвращает строку, полученную из аргумента — строки str с удаленными из ее конца пробелами;

  • deblank(c) — применяет функцию deblank к каждому элементу строкового массива ячеек с.

Примеры:

» S = 'computer'

S =

computer

» X = double(S)

X =

99 111 109 112 117 116 101 114

» ischar(S)

ans =

1

»c{l,l}='My ';

» c{l,2}='home ';

» c{1.3}='computer ';

» с

с=

'My ' 'home ' 'computer 

» с = deblank(c) 

с =

'My' 'home' 'computer'

Примечание

Правильная работа строковых функций с дополнительной кодовой таблицей ASCII возможна, но не гарантируется для систем, не прошедших адаптацию под тот или иной язык. В частности, проблемы работы с символами кириллицы (например перевод строки при наборе малой буквы «с» в командной строке) уже обсуждались. Поэтому примеры в этой главе даны для строк с символами основной кодовой таблицы.

 

3. Операции над строками

 

Операции над строками

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

  • findstr(str1,str2) — обеспечивает поиск начальных индексов более короткой строки внутри более длинной и возвращает вектор этих индексов. Индексы указывают положение первого символа более короткой строки в более длинной строке.

Пример:

» strb'Example of the function Is the findstr function';

» str2='the';

» k = findstr(strl,str2)

k =

12 28

  • lower('str') — возвращает строку символов str, в которой символы верхнего регистра переводятся в нижний регистр, а все остальные символы остаются без изменений.

Пример:

» str='Example Of The Function';

» t=lower(str)

t =

example of the function

  • upper( 'str') — возвращает строку символов str, в которой все символы нижнего регистра переводятся в верхний регистр, а все остальные символы остаются без изменений.

Пример:

» str='danger!';

» t = upper(str)

t =

DANGER!

  • strcat(sl,s2,s3,...) — выполняет горизонтальное объединение соответствующих рядов массивов символов s1, s2, s3 и т. д., причем пробелы в конце каждого ряда отбрасываются, и возвращает объединенную строку (ряд) результирующего массива символов, пробелы добавляются заново после анализа строк в полученном массиве. Все входные массивы должны иметь одинаковое число строк (в частном случае должны быть представлены в виде одной строки символов), но если один из входных аргументов — не массив символов, а строковый массив ячеек, то любой из других входных аргументов может быть скаляром или любым массивом той же размерности и того же размера. Если входной массив состоит только из символов, то выходной массив также будет являться массивом символов. Если любой из входных массивов является строковым массивом ячеек, то функция strcat возвращает строковый массив ячеек, сформированный из объединенных соответствующих элементов массивов si, s2, s3. при этом любой из элементов может быть скаляром и т. д.

Примеры:

» sl{1.2}='book'

» sl sl =

'Home' 'book' 

» s2{ 1.1}= 'home '

» s2{ 1,2}= 'reading'; 

» s2 s2 =

'home' 'reading' 

» t = strcat(sl.s2)

t =

'Homehome' 'book read ing' 

» sl=['wri '] 

s1 =wri

» s2=['ter'] 

s2 =ter

» t = strcat(sl.s2)

 t = 

writer

  • strvcat(t1,t2,t3....) — выполняет вертикальное объединение строк tl, t2, t3,.. в массив символов S аналогично char(tl,t2.t3....). Пример:

» t1=['string'];

» t2=['concatenation']:

» S = strvcat(tl.t2)

S =

string concatenation

  • strcmp( 'str1' . 'str2') — возвращает логическую единицу, если две сравниваемые строки str1 и str2 идентичны, и логический ноль в противном случае;

  • TF = strcmp(S.T) — возвращает строковый массив ячеек TF, содержащий единицы для идентичных элементов массивов S и Т и нули для всех остальных, причем если один из массивов — не массив символов, а строковый массив ячеек, то перед сравнением из сравниваемых копий рядов массива символов удаляются пробелы в конце строк. Массивы S и Т должны иметь одинаковый размер, или один из них может быть скалярной ячейкой.

Примеры:

» strl='computer'; 

» str2='computer'; 

» k = strcmp(strl.str2) 

k =

1

» S{l,l}='first'; 

» S{1,2}='second '

» S S =

'first''second' 

» T{l.l}='third'; 

» TF = strcmp(S.T) 

TF =

0 0

» T{1.1}='second';

» TF - strcmp(S.T) 

TF =

0 1

  • strncmp( 'strT , 'str2' ,n) — возвращает логическую единицу, если две сравниваемые строки strl и str2 содержат n первых идентичных символов, и логический ноль в противном случае. Аргументы strl и str2 могут быть также строковыми массивами ячеек.

  • TF = strncmp(S,T,n) — возвращает строковый массив ячеек TF, содержащий единицы для идентичных (до n символов) элементов массивов S и Т и нули для всех остальных.

Примеры:

» strl='computer'

strl =

computer

» strl='computer for me'

strl =

computer for me

» k = strncmp(strl.str2,3)

k =

» k = strncmp(strl,str2.12)

L =

  • strmatch( 'str' ,STRS, 'exact') — возвращает только индексы строк символов массива STRS, точно совпадающих со строкой символов str;

  • strjust(S) — возвращает выровненный вправо массив символов (т. е. перемещает пробелы в конце рядов массива символов, если они есть, в начало тех же рядов) [ Функция strjusttS, 'left') возвращает массив символов, где все строки выровнены влево, a strjusttS. 'center') — где все строки выровнены по центру.— Примеч.ред. ];

  • strmatch( 'str' ,STRS) — просматривает массив символов или строковый массив ячеек STRS по строкам, находит строки символов, начинающиеся с строки str, и возвращает соответствующие индексы строк;

Пример:

» STRS{1.1}='character':

» STRS{1.2}='array';

» STRS{2.1}='character array':

» STRS{2.2}='string':

» STRS

STRS =

'character' 'array'

'character array' 'string' 

» i = strmatchCcharac'.STRS)

 i =

1

2

»i = strmatch('character'.STRS.'exact') 

i =

1

  • strrep(strl,str2,str3) — заменяет все подстроки str2, найденные внутри строки символов str1 на строку str3;

  • strrep(strl,str2,str3) — возвращает строковый массив ячеек, полученный в результате выполнения функции strrep над соответствующими рядами входных массивов символов или ячеек, если один из аргументов strl, str2 или str3 — строковый массив ячеек. В этом случае любой из аргументов может быть также скалярной ячейкой.

Пример:

» strl='This is a good example for me.':

» str2='good';

» str3='best';

» str = strrep(strl.str2.str3)

str =

This is a best example for me.

  • strtokCstr' .delimiter) — возвращает часть текстовой строки str, ограниченную с ее конца разделителем del i miter. Символы-разделители в начале строки игнорируются. Вектор delimiter содержит возможные символы-разделители;

  • strtokCstr') — использует символ-разделитель по умолчанию («белое пространство»). Реальными символами-разделителями при этом являются символ табуляции (ASCII-код 9), символ возврата каретки (ASCII-код 13) и пробел (ASCII-код 32);

  • [token,rem]=strtok(...) — возвращает остаток rem исходной строки.

Примеры:

» str='This is a good example for me.': 

» token = strtok(str) 

token =

This

» token = strtok(str.'f') 

token =

This is a good example 

» [token,rem] = strtok(str) 

token = 

This 

rem =

is a good example for me.

 

4. Преобразование символов и строк

 

Преобразование символов и строк

  • int2str(X) — округляет элементы массива X до целых чисел и возвращает массив символов, содержащих символьные представления округленных целых чисел. Аргумент X может быть скаляром, вектором или матрицей.

Пример:

» X=magic(3) 

X =

8 1 б

3 5 7

4 9 2 

Х=Х+0.05 

X =

8.0500 1.0500 6.0500

3.0500 5.0500 7.0500

4.0500 9.0500 2.0500 

» str=int2str(X) 

str =

8 1 б 357 492

  •  mat2str(A) — преобразует матрицу А в единую строку; если элемент матрицы не скаляр, то он заменяется на [ ], при этом учитываются 15 знаков после десятичной точки;

  • mat2str(A,n) — преобразует матрицу А в строку, используя точность до n цифр после десятичной точки. Функция eval(str) осуществляет обратное преобразование.

Пример:

» randС state'); 

» A=rand(4.3) 

А =

0.9501 0.8913 0.8214

0.2311 0.7621 0.4447

0.6068 0.4565 0.6154

0.4860 0.0185 0.7919 

» str = mat2str(A,2)

str =

[0.95 0.89 0.82:0.23 0.76 0.44:0.61 0.46 0.62:0.49 0.019 0.79]

  • num2str(A) — выполняет преобразование массива А в строку символов str с точностью до четырех десятичных разрядов и экспоненциальным представлением, если требуется. Обычно используется при выводе графиков совместно с title, xlabel. ylabel или text;

  • num2str(A,precision) — выполняет преобразование массива А в строку символов str с максимальной точностью, определенной аргументом precision. Аргумент precision определяет число разрядов в выходной строке;

  • num2str(A,format) — выполняет преобразование массива чисел А, используя заданный формат format. По умолчанию принимается формат, который использует четыре разряда после десятичной точки для чисел с фиксированной или плавающей точкой.

Пример:

» str = num2str(pi.7)

str =

3.141593

» randCstate'):

» A=rand(3,5)

A =

0.9501 0.4860 0.4565 0.4447 0.9218

0.2311 0.8913 0.0185 0.6154 0.7382

0.6068 0.7621 0.8214 0.7919 0.1763 

» str = num2str(A,l) 

str =

1 0.5 0.5 0.4 0.9 0.20.9 0.02 0.6 0.7 0.60.8 0.8 0.8 0.2

  • str2double( 'str') — выполняет преобразование численной строки s, которая представлена в ASCII-символах, в число с двойной точностью. При этом + и -могут быть только в начале строки.

Пример:

» х = str2double('5.45+2.67Г) 

5.4500 + 2.67001

Обратите особое внимание на последнюю функцию, поскольку именно она в MATLAB 6 обычно обеспечивает переход от символьного представления математических выражений к их вычисленным численным значениям;

  • str2num(s) — выполняет преобразование численного массива символов — матрицы или строки s, который представлен в ASCII-символах, в матрицу (массив размерности 2).

Пример:

» х = str2num('5.45+2.67') 

8.1200

Обратите особое внимание, что при этом можно вводить знаки + и - в любом месте строки. Предыдущая функция выдала бы NaN. Но фирма MathWorks рекомендует использовать str2num с осторожностью и по возможности заменять ее на str2double.

 

5. Функции преобразования систем счисления

 

Функции преобразования систем счисления

Некоторые строковые функции служат для преобразования систем счисления. Ниже представлен набор этих функций.

  • bin2dec( 'binarystr') — возвращает десятичное число, эквивалентное строке двоичных символов binarystr.

Пример:

» bin2dec('101') 

ans =

5

  • dec2bin(d) — возвращает строку двоичных символов (0 и 1), эквивалентную десятичному числу d. Аргумент d должен быть неотрицательным целым числом, меньшим чем 2 52 ;

  • dec2bin(d.n) — возвращает строку двоичных символов, содержащую по меньшей мере n бит.

Пример:

» str = dec2bin(12)

str =

1100

  • dec2base(d.n) — возвращает строку символов, представляющих десятичное число d как число в системе счисления с основанием n.

Пример:

» str = dec2base(1234.16)

str =

4D2

  • dec2hex(d) — возвращает шестнадцатеричную строку символов, эквивалентную числу d. Аргумент d должен быть неотрицательным целым числом, меньшим чем 2 52 ;

  • str = dec2hex(d.n) — возвращает шестнадцатеричную строку, содержащую по меньшей мере n цифр.

Пример:

» str = dec2hex(1234)

str = 

4D2

  • base2dec(S, В) — преобразует строку символов S, представляющих число в системе счисления по основанию В, в символьное представление десятичного числа.

Пример:

» d = base2dec('4D2',16) 

 d =

1234;

  • hex2dec('hex_value') — возвращает число d, представленное строкой шестнадцатеричных символов hex_value. Если аргумент hex_value является массивоу символов, то каждая строка этого массива интерпретируется как шестнадца-теричное представление числа.

Пример:

» d = hex2dec('4D2') 

d =

1234

  •  hex2num( 'hex_value') — возвращает десятичное число f с удвоенной точностью, эквивалентное шестнадцатеричному числу, находящемуся в строке символов hex_va1ue.

Пример:

» f = hex2num('4831fb52al8')

f = 

6.1189е+039

 

6. Вычисление строковых выражений

 

Вычисление строковых выражений

Строковые выражения обычно не вычисляются, так что, к примеру, вывод строки ' 2+3' просто повторяет строку:

» '2+3'

ans = 

2+3

Однако с помощью функции eval ('строковое выражение'.) строка, представляющая математическое выражение, может быть вычислена:

» eval C2+3') 

ans =

5

» eval('2*sin(l)')

 ans =

1.6829

Ниже использование eval возвращает 12 матриц, представляющих магические квадраты чисел от 1 до 12:

for n = 1:12

eval(['IT num2str(n) ' = magic(n)']) 

end

eval (SI,S2) — в случае ошибки в вычислении выражения s1 оценивает выражение s2.

T=evalc (S) выполняет то же, что и функция eval(s), но то, что выводится в командное окно, записывается также и в массив Т;

Еще одна функция — feval (@имя_функции,х1,х2,...) — имеет важное достоинство — она позволяет передавать в вычисляемую функцию список ее аргументов. При этом вычисляемая функция задается только своим именем. Это поясняют следующие примеры:

» feval(@prod.[l 23]) 

ans = 

6

Существовавшая в прежних версиях MATLAB форма feval (' иня_функции' ,xl. х2,...) по-прежнему работает, но применять ее не рекомендуется. 

» feval(@sum.[l 2 3: 4 5 6].2)

 ans =

6

15

Рекомендуется применять функцию feval при вычислении значений функций, записанных в виде строки, вместо eval. m-файлы-функции, содержащие функцию feval, корректно компилируются компилятором системы MATLAB.

Для выполнения вычислений, представленных строкой expression, в заданной рабочей области ws служит функция evalin(ws.expression). Переменная ws может иметь два значения: 'base' — для основной рабочей области и 'caller' — для рабочей области вызванной функции. В приведенном ниже примере в рабочей области записаны переменные а и b и вычисляется символьное значение 'а+b':

» а=2;b=3;

» evalin('base','a+b') 

ans = 

5

Функция может также записываться в виде [а1.а2,аЗ,...] = eval in(ws, expression), где a1, а2, а3,... — переменные, возвращающие результаты вычислений. А функция evalin(ws,expression, catch_expr) позволяет проверить правильность выражения expression в рабочей области и сформировать сообщение, заданное в строке   catch_expr.

Например (в продолжение последнего примера):

» h='Error in expression';

» evalin('base'. 'a+b'. 'h'); 

ans = 

5

» evalinCbase'. 'a+c', 'h'); h = Error in expression

Здесь выражение а+с ошибочно (переменная с не определена), поэтому выдана переменная h с ее значением в виде строки.

 

7. Что нового мы узнали?

 

Что нового мы узнали?

В этом уроке мы научились:

  • Использовать функции строковых данных.

  • Выполнять операции над строками.

  • Преобразовывать символы в строки.

  • Использовать функции преобразования систем счисления.

  • Вычислять строковые выражения.