Isa( s3, 'char' )
вернёт истину (единицу), если переменная s3 является в этот момент строковой (символьной), и вернёт ложь (нуль) в противоположном случае.
По отношению к массивам символов справедливы также все операции, которые мы ранее рассмотрели для случая массивов типа double. Например, вместо группового присваивания c2 = 'abcd' можно организовать поэлементное присваивание с помощью операции индексации:
c2(1)='a'; c2(2)='b'; c2(3)='c'; c2(4)='d';
или осуществить операцию конкатенации
c2 = [ 'abc', 'd' ]; c2 = [ c2, ' QWERTY' ];
В тесной связи с рассмотренной операцией конкатенации текстовых строк находится стандартная функция int2str, которая преобразует целые числовые значения в символы, отображающие эти целые числа. Например, вызов функции
res = int2str(2)
приведёт к появлению текстовой переменной res со значением '2'. В итоге, мы имеем возможность сформировать в цикле набор нескольких имён функций, отличающихся только последним символов - их номером:
name = 'function'; arg = 10.7;
for k = 1: 10
Name = [ name,int2str(k) ];
res(k) = feval(Name, arg);
End
и даже вычислить значения всех таких функций при значении аргумента arg. Это осуществляется с помощью стандартной функции системы MATLAB feval, которая принимает в качестве своего первого аргумента текстовую строку с именем M-функции, подлежащей вычислению. Второй и последующие аргументы этой функции служат для передачи в качестве аргументов вычисляемым функциям.
В вышеприведённом фрагменте результаты вычислений десяти функций запоминаются в массиве res.
Если требуется в одной переменной запомнить несколько имён функций (это возможно в случае их одинаковой длины) для последующего их исполнения с помощью feval, то можно сформировать текстовый массив размерности 2;
Names(1,:) = 'function1';
Names(2,:) = 'function2';
Первая строка этого массива содержит имя первой функции, вторая строка - второй функции. Размер этого массива типа char есть 2 x 9.
Часто текстовые строки используются для вывода в командное окно системы MATLAB для информирования пользователя о ходе выполнения M-функции. Это осуществляется с помощью функции disp, принимающей в качестве аргумента текстовую строку:
x = 7;
message = [ ' Variable x = ', int2str(x) ];
disp(message);
Кроме того, в командное окно надо выводить сообщения, предупреждающие пользователя о необходимости ввода с клавиатуры значения переменной:
VarX = input(' VarX =? ');
Функция input выводит в командное окно текст, являющийся её аргументом, после чего ожидает ввода значения с клавиатуры и нажатия клавиши Enter. Таким образом можно ввести с клавиатуры числовое значение и запомнить её значение в переменной VarX. Внутри строки-аргумента функции input может присутствовать специальный набор из двух символов /n, приводящий к показу сообщения на двух строках (часть сообщения после /n показывается на новой строке).
Для ввода текстового значения, а не числового, требуется вызывать функцию input с двумя аргументами:
VarStr = input(' StringVar = ', 's');
В результате выполнения этой функции на экране появляется надпись
StringVar =
после чего можно набирать необходимый текст с клавиатуры, заканчивая ввод нажатием клавиши Enter. Если нажать Enter, не введя с клавиатуры никакого текста, то переменная VarStr примет значение пустого массива. Желательно перед использованием этой переменной проверять её на этот случай функцией isempty(VarStr), возвращающей единицу, когда аргумент является пустым массивом.
Система MATLAB располагает также полным набором функций для "классической" обработки текстов. К таким функциям относятся функции findstr, blanks, deblank, num2str, str2num, strcat, strcmp, strcmpi, strrep, strtok.
Функции num2str, str2num производят преобразования из строк в действительные числа и обратно, функции blanks, deblank, strrep работают с пробелами и повторением символов, функция strcat осуществляет конкатенацию, функции strcmp и strcmpi сравнивают значения двух строк, функции findstr и strtok находят или выделяют в строках подстроки.
Например, в следующем фрагменте находится массив позиций вхождения слова Hello в текст, содержащийся в переменной vStr:
innerStr = 'Hello';
vStr='Hello is the word. Hello is opposite to bye.';
positions = findstr(vStr, innerStr);
В результате переменная (массив) positions принимает следующее значение:
positions = 1 20
В итоге функция findstr обнаружила два вхождения переменной innerStr в текст Vstr. Первое вхождение имеет место начиная с самого первого символа, второе вхождение имеет место на 20-ом символе (включая пробелы, разумеется).
Если функция findstr не находит вхождений вообще, то она возвращает пустой массив, который надо проверять функцией isempty.
#$+Массивы структур.
Бывает желательно под одним именем объединить числовые и текстовые данные (например, результаты физических экспериментов, данные о переписи населения и так далее). Для этой цели в системе MATLAB предусмотрен специальный тип данных - struct (структура).
Переменные типа struct имеют в своём составе несколько именованных полей. Создадим переменную MyStruct1, состоящую из двух полей: одного числового поля с именем data и одного текстового поля с именем name:
MyStruct1.name = '1st result';
MyStruct1.data = [ 1, 2.5; -7.8, 2.3 ];
Имя поля отделяется от имени переменной точкой. В данном фрагменте кода создаётся массив MyStruct1 типа struct размером 1 x 1.
Добавим в только что созданный массив MyStruct1 второй элемент:
MyStruct1(2).name = '2nd res-t';
MyStruct1(2).data = [ -5.7, -2.5; 7.1, 8.4 ];
Получился массив размера 1x2. В этом легко убедиться, если набрать в командном окне MATLABа имя переменной MyStruct1 и нажать клавишу Enter. В результате система покажет не содержимое этого массива, а его структуру:
Можно и далее добавлять элементы к этому одномерному массиву. Достаточно очевидно, что все элементы массива типа struct имеют одинаковое количество полей с фиксированными именами. Если явно не задать значение какого-либо поля, то ему автоматически будет присвоен пустой массив [].
Набор полей массива структур можно изменять динамически. Например, уже после того, как мы определили массив MyStruct1 типа struct размера 1x2 с двумя указанными выше полями (name и data), можно выполнить присваивание
MyStruct1(1).field = 'Third field';
после которого массив структур уже будет обладать тремя полями - name, data и field. Так как у второго элемента массива MyStruct1 поле field явно не задано, то оно равно пустому массиву:
Дата добавления: 2015-01-18 | Просмотры: 593 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|