Урок №18.

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

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

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

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

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

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

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

Пример:

» 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

Примеры:

» 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 возможна, но не гарантируется для систем, не прошедших адаптацию под тот или иной язык. В частности, проблемы работы с символами кириллицы (например перевод строки при наборе малой буквы «с» в командной строке) уже обсуждались. Поэтому примеры в этой главе даны для строк с символами основной кодовой таблицы.

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

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

Пример:

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

» str2='the';

» k = findstr(strl,str2)

k =

12 28

Пример:

» str='Example Of The Function';

» t=lower(str)

t =

example of the function

Пример:

» str='danger!';

» t = upper(str)

t =

DANGER!

Примеры:

» 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

» tl=['string'];

» t2=['concatenation']:

» S = strvcat(tl.t2)

S =

string concatenation

Примеры:

» 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

Примеры:

» strl='computer'

strl =

computer

» strl='computer for me'

strl =

computer for me

» k = strncmp(strl.str2,3)

k =

» k = strncmp(strl,str2.12)

L =

Пример:

» 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

Пример:

» 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.

Примеры:

» 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.

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

Пример:

» 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

Пример:

» 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]

Пример:

» 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('5.45+2.67Г) 

5.4500 + 2.67001

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

Пример:

» х = str2num('5.45+2.67') 

8.1200

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

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

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

Пример:

» bin2dec('101') 

ans =

5

Пример:

» str = dec2bin(12)

str =

1100

Пример:

» str = dec2base(1234.16)

str =

4D2

Пример:

» str = dec2hex(1234)

str = 

4D2

Пример:

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

 d =

1234;

Пример:

» d = hex2dec('4D2') 

d =

1234

Пример:

» f = hex2num('4831fb52al8')

f = 

6.1189е+039

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

Строковые выражения обычно не вычисляются, так что, к примеру, вывод строки ' 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 с ее значением в виде строки.

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

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