- •Начала программирования в среде MatLab
- •Содержание
- •Предисловие
- •Введение
- •1. MatLAB как научный калькулятор
- •1.1. Командное окно
- •1.2. Операции с числами
- •1.2.1. Ввод действительных чисел
- •1.2.2. Простейшие арифметические действия
- •1.2.3. Ввод комплексных чисел
- •1.2.4. Элементарные математические функции
- •1.2.5. Специальные математические функции
- •1.2.6. Элементарные действия с комплексными числами
- •1.2.7. Функции комплексного аргумента
- •1.2.8. Задания
- •1.2.9. Вопросы
- •1.3. Простейшие операции с векторами и матрицами
- •1.3.1. Ввод векторов и матриц
- •1.3.2. Формирование векторов и матриц
- •1.3.3. Извлечение и вставка частей матриц
- •1.3.4. Действия над векторами
- •1.3.5. Поэлементное преобразование матриц
- •1.3.6. Матричные действия над матрицами
- •1.3.7. Матричные функции
- •1.3.8. Задания
- •1.3.9. Вопросы
- •1.4. Функции прикладной численной математики
- •1.4.1. Операции с полиномами
- •1.4.2. Обработка данных измерений
- •1.4.3. Функции линейной алгебры
- •1.4.4. Аппроксимация и интерполяция данных
- •1.4.5. Векторная фильтрация и спектральный анализ
- •1.4.6. Задания
- •1.4.7. Вопросы
- •1.5. Построение простейших графиков
- •1.5.1. Процедура plot
- •1.5.2. Специальные графики
- •1.5.3. Дополнительные функции графического окна
- •1.5.5. Задания
- •1.5.6. Вопросы
- •1.6. Операторы управления вычислительным процессом
- •1.6.1. Оператор условного перехода
- •1.6.2. Оператор переключения
- •1.6.3. Операторы цикла
- •1.6.4. Задания
- •1.6.5. Вопросы
- •2. Программирование в среде MatLAB
- •2.1. Функции функций
- •2.2. Создание М-файлов
- •2.2.1. Особенности создания М-файлов
- •2.3.1. Общие требования к построению
- •2.3.2. Типовое оформление процедуры-функции
- •2.3.3. Задания
- •2.3.4. Вопросы
- •2.4. Создание Script-файлов
- •2.4.1. Основные особенности Script-файлов
- •2.4.2. Ввод и вывод информации в диалоговом режиме
- •2.4.3. Организация повторения действий
- •2.4.4. Организация изменения данных в диалоговом режиме
- •2.4.5. Типовая структура и оформление Script-файла
- •2.5. Графическое оформление результатов
- •2.5.1. Общие требования к представлению графической информации
- •2.5.2. Разбивка графического окна на подокна
- •2.5.3. Вывод текста в графическое окно (подокно)
- •2.6. Создание функций от функций
- •2.6.1. Процедура feval
- •2.6.2. Примеры создания процедур от функций
- •2.6.3. Задания
- •2.7. Пример создания сложной программы
- •2.7.1. Программа моделирования движения маятника
- •2.7.2. Задания
- •3.1. Функции меню командного окна
- •3.1.2. Другие меню командного окна
- •3.1.3. Панель инструментов
- •3.2. Команды общего назначения
- •3.3. Создание М-книги
- •3.3.1. Начало новой М-книги
- •3.3.2. Написание М-книги
- •3.3.3. Редактирование М-книги
- •3.3.4. Преобразование документа WORD в М-книгу
- •3.3.6. Изменение параметров вывода результатов
- •4. Классы вычислительных объектов
- •4.1. Основные классы объектов
- •4.1.1. Класс символьных строк (char)
- •4.1.2. Класс записей (struct)
- •4.1.3. Класс ячеек (cell)
- •4.2. Производные классы MatLAB
- •4.2.1. Класс объектов Inline
- •4.2.2. Классы пакета CONTROL
- •4.3. Пример создания нового класса polynom
- •4.3.1. Создание подкаталога @polynom
- •4.3.2. Создание конструктора
- •4.3.3. Создание процедуры символьного представления polynom-объекта.
- •4.4. Создание методов нового класса
- •5.1. Формирование типовых процессов
- •5.1.1. Формирование одиночных импульных процессов
- •5.1.2. Формирование колебаний
- •5.2.1. Основы линейной фильтрации
- •5.2.2. Формирование случайных процессов
- •5.3. Процедуры спектрального (частотного) и статистического анализа процессов
- •5.3.1. Основы спектрального и статистического анализа
- •5.3.2. Примеры спектрального анализа
- •5.3.3. Статистический анализ
- •5.4. Проектирование фильтров
- •5.4.1. Формы представления фильтров и их преобразования
- •5.4.2. Разработка аналоговых фильтров
- •5.4.3. Проектирование БИХ-фильтров
- •5.5. Графические и интерактивные средства
- •5.5.1. Графические средства пакета SIGNAL
- •5.5.2. Интерактивная оболочка SPTOOL
- •6.1. Ввод и преобразование моделей
- •6.2. Получение информации о модели
- •6.3. Анализ системы
- •6.4. Интерактивный "обозреватель" ltiview
- •6.5. Синтез системы
- •7.1. Общая характеристика пакета SimuLink
- •7.1.1. Запуск SimuLink
- •7.1.2. Библиотека модулей (блоков)
- •7.1.3. Раздел Sinks (приемники)
- •7.1.4. Раздел Sources (Источники)
- •7.1.5. Раздел Сontinuous
- •7.1.6. Раздел Discrete
- •7.1.7. Раздел Math
- •7.1.8. Раздел Functions & Tables
- •7.1.9. Раздел Nonlinear
- •7.1.10. Раздел Signals & Systems
- •7.2. Построение блок-схем
- •7.2.1. Выделение объектов
- •7.2.2. Оперирование с блоками
- •7.2.3. Проведение соединительных линий
- •7.2.4. Проставление меток сигналов и комментариев
- •7.2.5. Создание подсистем
- •7.2.6. Запись и распечатка блок-схемы S-модели
- •7.3. Примеры моделирования
- •7.3.1. Моделирование поведения физического маятника
- •7.3.2. Моделирование поведения гироскопа в кардановом подвесе
- •7.4. Объединение S-моделей с программами MatLAB
- •7.4.2. Функции пересечения нуля
- •7.4.5. Образование S-блоков путем использования программ MatLab. S-функции
- •7.4.6. Пример создания S-функции
- •7.5.1. Создание библиотеки
- •7.5.2. Маскировка блоков
- •7.5.3. Моделирование процесса ориентации космического аппарата
- •Послесловие
- •Предметный указатель
- •Указатель операторов, команд, функций и функциональных блоков MatLAB
3.1. Основные классы объєктов |
162 |
|
|
|
|
4. Классы вычислительных объектов
Классом в MatLAB принято называть определенную форму представления вычислительных объектов в памяти ЭВМ в совокупности с правилами (процедурами) их преобразования. Класс определяет тип переменной, а правила - операции и функции, которые могут быть применены к этому типу. В свою очередь, тип определяет объем памяти, которая отводится записи переменной в память ЭВМ и структуру размещения данных в этом объеме. Операции и функции, которые могут быть применены к определенному типу переменных, образовывают методы этого класса.
4.1.Основные классы объектов
Всистеме MatLAB определены шесть встроенных классов вычислительных объектов:
-double - числовые массивы и матрицы действительных или комплексных чисел с плавающей запятой в формате двойной точности;
-sparse - двумерные действительные или комплексные разреженные матри-
цы;
-char - массивы символов;
-struct - массивы записей (структуры);
-cell - массивы ячеек;
-uint8 - массивы 8-битовых целых чисел без знаков.
Класс double определяет наиболее распространенный тип переменных в системе MatLAB, с которыми оперирует большинство функций и процедур. Класс char определяет переменные, которые являются совокупностью символов (каждый символ занимает в памяти 16 битов). Эту совокупность часто называют строкой. Класс sparse определяет тип переменных, которые являются разреженными матрицами двойной точности. Разреженная структура применяется для хранения матриц с незначительным количеством ненулевых элементов, что позволяет использовать лишь незначительную часть памяти, необходимой для хранения полной матрицы. Разреженные матрицы требуют применения специальных методов для решения задач. Переменные класса cell (ячейки) являются совокупностью некоторых других массивов. Массивы ячеек позволяют объединить связанные данные (возможно, разных типов и размеров) в единую структуру. Объекты класса struct состоят из нескольких составляющих, которые называются полями, каждое из которых носит собственное имя. Поля сами могут содержать массивы. Подобно массивам ячеек, массивы записей объединяют связанные данные и информацию о них, однако способ обращения к элементам структуры (полям) принципиально иной - путем указывания имени поля через точку после имени структуры. Наконец, класс uint8 позволяет сохранять целые числа от 0 до 255 в 1/8 части памяти, необходимой для чисел двойной точности. Никакие математические операции для этого класса данных не определены.
3.1. Основные классы объєктов |
163 |
|
|
|
|
Каждому типу данных соответствуют собственные функции и операторы обработки, т. е. методы. Приведем некоторые из них:
-класс array (обобщенный класс объектов-массивов, являющийся прародителем всех упомянутых встроенных классов) имеет такие методы: определение размеров (size), длины (length), размерности (ndims), объединение массивов ([a b]), транспонирование (transpose), многомерная индексация (subindex), переопределение (reshape) и перестановка (permute) измерений многомерного массива;
-методы класса char (строки символов) - строковые функции (strcmp, lower), автоматическое преобразование в тип double;
-методы класса cell - индексация с использованием фигурных скобок {e1,...en} и разделением элементов списка запятыми;
-методы класса double - поиск (find), обработка комплексных чисел (real, imag), формирование векторов, выделение строк, столбцов, подблоков массива, расширение скаляра, арифметические и логические операции, математические функции, функции от матриц;
-методы класса struct - доступ к содержимому поля ( . field) (разделитель элементов списка - запятая);
-в классе uint8 - единый метод - операция сохранения (чаще всего приме-
няется с пакетом Image Processing Toolbox).
4.1.1.Класс символьных строк (char)
Введение строк символов из клавиатуры осуществляется в апострофах. Например, вводя совокупность символов
>> 'Это'
получим в командном окне
ans = Это
Аналогично, при помощи знака присваивания, производится определение переменных типа char:
>> st1 = ' Это '; st2 = ' строка '; st3 = ' символов. '; >> st1,st2,st3
st1 = Это st2 = строка
st3 = символов.
Объединение нескольких строк в единую строку (сцепление или конкате-
нацию) можно осуществить с помощью обычной операции объединения векторов в строку:
>>[st1 st2 st3 ]
ans = Это строка символов.
Другая возможность достичь той же цели - использование процедуры strcat(s1,s2,...sn), которая производит сцепление заданных строк s1, s2, ... sn в единую строку в порядке их указания в списке аргументов:
>> st = strcat(st1,st2,st3) st = Это строка символов.
3.1. Основные классы объєктов |
164 |
|
|
|
|
Объединить строки символов в несколько отдельных, но соединенных в единую конструкцию строк, можно, используя другую процедуру - strvcat (вертикальной конкатенации):
>> stv = strvcat(st1,st2,st3) stv =
Это
строка
символов
Примечание. Для такого сцепления символьных строк нельзя применять операцию вертикального сцепления (символ ' ; '), используемую для построения матрицы из отдельных строк, так как количество элементов (символов) сцепляемых символьных строк может быть различным). Например
>> [st1; st2; st3]
??? All rows in the bracketed expression must have the same number of columns.
Символьная строка представляет собой массив (точнее – вектор-строку), элементами которого являются отдельные символы, из которых она состоит, включая символы пробелов. Поэтому информацию о любом символе в строке можно получить, указав номер этого символа от начала строки (при этом, конечно, надо учитывать и символы пробелов). Например:
>> st(3) ans = т
>> st(3:12) ans = то строка
Совокупность вертикально сцепленных строк образует двумерный массив (матрицу) символов. Поэтому, команда
>> ss =stv(2,3:end)
приводит к результату:
ss = трока
Процедура strrep(s1, s2, s3) формирует строку из строки s1 путем замены всех ее фрагментов, которые совпадают с строкой s2 на строку s3:
>> st = [st1 st2 st3]
st = Это строка символов.
>> y = strrep(st,'о','а') y = Эта страка симвалав.
>> x = strrep(st,'а','о') x = Это строко символов.
Функция upper(st) переводит все символы строки st в верхний регистр. Например:
>> x1 = upper(st)
x1 = ЭТО СТРОКА СИМВОЛОВ.
Аналогично, функция lower(st) переводит все символы в нижний регистр:
>> x2 = lower(x1)
x2 = это строка символов.
Процедура findstr(st,st1) выдает номер элемента строки st, с которого начинается первое вхождение строки st1, если она есть в строке st:
>> findstr(st,'рок') ans = 9
Как ранее отмечалось, довольно часто возникает необходимость вставить в строку символов числовое значение одного или нескольких рассчитанных пара-
3.1. Основные классы объєктов |
165 |
|
|
|
|
метров, что связано с переводом числовой переменной в строку символов определенного вида. Это можно сделать с помощью процедуры num2str. Входным аргументом этой процедуры является числовая переменная (класса double). Процедура формирует представление значения этой числовой переменной в виде символьной строки. Формат представления определяется установленным форматом Numeric Format. В качестве примера рассмотрим формирования текстовой строки с включением значения переменной:
>>x = pi;
>>disp(['Значение переменной ''x'' равно ', num2str(x)])
Значение переменной 'x' равно 3.1416
Аналогичним образом, при помощи процедуры mat2str(A) можно получить значение матрицы А в виде символьной строки:
>>A = [1,2,3;4 5 6; 7 8 9];
>>disp(mat2str(A))
[1 2 3;4 5 6;7 8 9]
Обратный переход от символьного представления числа к численному осуществляется процедурой str2num :
>> stx = num2str(x) stx = 3. 1416
>> y = str2num(stx) y = 3. 1416
>> y+5
ans = |
8. |
1416 |
>> z = stx+5 |
||
z = |
56 |
51 54 57 54 59 |
Последний результат получен вследствие того, что строка символов stx при включении ее в арифметическую операцию автоматически перестраивается в класс double, т. е. все символы, составляющие ее, заменяются целыми числами, равными коду соответствующего символа. После этого сложение полученного числового вектора с числом 5 происходит по обычным правилам, т. е. 5 суммируется с каждым из кодов символов. Проверим это, учитывая, что с помощью процедуры double(str) можно получить числовое представление строки символов str в виде кодов составных ее символов:
>> double(stx)
ans = 51 46 49 52 49 54
Сравнивая полученный результат с предыдущим, можно убедиться в справедливости сказанного.
Функция str2mat(st1,st2,... ,stn) действует аналогично функции strvcat(st1,st2, ... , stn), т. е. образует символьную матрицу, располагая строки st1, st2, ... ,stn одна под другой:
>> Z = str2mat(st1,st2,st3)
Z = Это строка символов
4.1.2. Класс записей (struct)
Массивы записей - это тип массивов в системе MatLAB, в котором разрешается сосредоточивать в виде записей разнородные данные (т. е. данные разных
3.1. Основные классы объєктов |
166 |
|
|
|
|
классов). Отличительной особенностью таких массивов является наличие именованных полей.
Как и вообще в MatLAB, массивы записей не объявляются. Отдельные экземпляры этого класса создаются автоматически при задании конкретных значений полям записи.
Обращение к любому полю за именем field осуществляется так:
<имя переменной-записи> . field
Например, команда
>> PG81. fam = 'Аврутова'
PG81 =
fam: 'Аврутова'
приводит к автоматическому формированию переменной PG81 класса struct с единственным полем fam, значение которого - символьная строка Аврутова. Таким же образом к этой переменной можно добавлять другие поля:
>>PG81. imya = 'Марина'; PG81. bat = 'Степановна';
>>PG81
PG81 =
fam: 'Аврутова' imya: 'Марина' bat: 'Степановна'
В результате получим ту же переменную-запись, но уже с тремя полями. Чтобы создать массив аналогичных переменных с теми же полями и с тем же именем PG81 достаточно доибавлять при обращении к этому имени номер записи (в скобках, как к элементу массива):
>>PG81(2). fam = 'Березнюк' ;
>>PG81(2). imya = 'Алексей'; PG81(2). bat = 'Иванович';
>>PG81(3). fam = 'Попель' ;
>>PG81(3). imya = 'Богдан'; PG81(3). bat = 'Тимофеевич';
>>PG81
PG81 =
1x3 struct array with fields: fam
imya bat
Как видим, в случае массива записей, содержимое полей уже не выводится на экран. Выводится лишь информация о структуре массива, его размерах и именах полей.
Для получения информации о именах полей записи можно использовать функцию fieldnames:
>> fieldnames(PG81) ans =
'fam'
'imya'
'bat'
Другой способ задания переменной-записи - применение функции struct по
схеме
<имя записи> = struct('<имя поля1>', <значение1>, '<имя поля2>', <значе-
ние2>, ...).
Например, команда