Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теория фильтрации Лаба4 / Справочная информация

.pdf
Скачиваний:
22
Добавлен:
26.03.2015
Размер:
908.39 Кб
Скачать

Основы программирования на языке MATLAB

Язык программирования системы MATLAB вобрал в себя все средства, необходимые для реализации различных видов программирования: процедурного, функционального, объектноориентированного, структурного (модульного), визуально-ориентированного и т.п. [12]. MATLAB имеет черты известных языков программирования высокого уровня: BASIC, Pascal, FORTRAN [13]:

-среда выполнения MATLAB представляет собой интерпретатор;

-отсутствует необходимость в объявлении типов и размеров переменных;

-обеспечивается возможность образования новых типов вычислительных объектов (классов) на основе типов объектов, уже существующих в языке;

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

-в языке MATLAB нет глобальных переменных, однако интерпретатор MATLAB позволяет в одном и том же сеансе работы выполнять несколько самостоятельных программ, причем все переменные, используемые в этих программах, являются общими для этих программ и образуют общее рабочее пространство (Workspace);

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

Особенности записи программы на языке MATLAB

Основные особенности записи текста программы (m-файла) на языке MATLAB [13]:

-обычно каждый оператор записывается в отдельной строке текста программы. Признаком конца оператора является конец строки. Можно размещать несколько операторов в одной строке, тогда предыдущий оператор этой строки должен заканчиваться символом ' ; ' или ' , '. Можно длинный оператор записывать в несколько строк. При этом предыдущая строка оператора должна заканчиваться тремя точками " ... ".

-если очередной оператор не заканчивается символом ' ; ', результат его действия при выполнении программы будет выведен в командное окно. Чтобы предотвратить вывод на экран результатов действия оператора программы, запись этого оператора в тексте программы должна заканчиваться символом ' ; '. Если выражение завершается знаком ';', то MATLAB не выводит результирующее значение на экран. Обычно формат оператора с ';' используется при работе со средой в интерактивном режим, а без ';' – при написании программы;

-строка программы, начинающаяся с символа ' % ', не выполняется. Эта строка воспринимается системой MATLAB как комментарий;

-строки комментария, предшествующие первому выполняемому оператору программы, т. е. такому, который не является комментарием, воспринимаются системой MATLAB как описание программы;

-в программах на языке MATLAB отсутствует символ окончания текста программы;

-в языке MATLAB переменные не описываются и не объявляются. Любое новое имя, появляющееся в тексте программы при ее выполнении, воспринимается системой как имя

матрицы. Размер этой матрицы устанавливается при предварительном вводе значений ее элементов либо определяется действиями по установлению значений ее элементов, описанными

впредшествующих операторах или процедуре;

-имена переменных могут содержать лишь буквы латинского алфавита или цифры и должны начинаться из буквы. Общее число символов в имени может достигать 30. В именах переменных могут использоваться как прописные, так и строчные буквы. Строчные и прописные буквы в именах различаются.

Файлы-сценарии и файлы-функции

Все команды, которые вводятся в командной строке (Command Window), можно сохранить в виде единой последовательности в файле с расширением ‘m’. Такой файл называется сценарием (script-файлом) и может быть запущен на выполнение из командной строки, из другого m-файла или непосредственно из текстового редактора MATLAB. Для файлов сценариев характерны следующие особенности:

-они не имеют входных и выходных аргументов;

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

-в процессе выполнения не компилируются;

-представляют собой законченную последовательность операций, полностью аналогичную той, что используется при работе с командной строкой.

Структура файла-сценария обычно имеет следующий вид:

%Основной комментарий (необязательный) %Дополнительный комментарий (необязательный) Тело_файла. Содержит любые допустимые выражения MATLAB

Основной комментарий выводится при выполнении команд lookfor и <help имя_каталога>. Основной и дополнительный комментарии выводятся при выполнении команды <help имя_файла>.

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

function var=f_name(Cпиcoк_napaмeтpов)

%Основной комментарий (необязательный) %Дополнительный комментарий (необязательный) Тело файла с любыми выражениями vаr=выражение

17

Файл-функция имеет следующие свойства:

-он начинается с объявления function, после которого указывается имя переменной var – выходного параметра (для случая одного выходного параметра), имя самой функции и список ее входных параметров – все это указывается в первой строке файла;

-функция возвращает свое значение и может использоваться в виде f_name (Список_параметров) в математических выражениях;

-все переменные, имеющиеся в теле файла-функции, являются локальными, т. е. действуют только в пределах тела функции;

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

-правила вывода комментариев те же, что у файлов-сценариев;

-файл-функция служит средством расширения системы MATLAB;

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

-конструкция vаг=выражение необходима, если требуется, чтобы функция возвращала результат вычислений.

Если выходных параметров больше одного, то они указываются в квадратных скобках после слова function. При этом структура модуля имеет следующий вид:

function [varl,var2....]=f_name(Список_параметров) %Основной комментарий (необязательный) %Дополнительный комментарий (необязательный)

Тело файла с любыми выражениями vаг1=выражение

vаг2=выражение

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

При необходимости функции m-файла могут разделять общую переменную. Для работы с такой переменной в каждой из функций, где она используется, переменную необходимо объявить с использованием оператора global.

Файл-функция (в отличие от файла-сценария) может содержать несколько функций, однако из других модулей (или рабочего пространства) может быть вызвана только первая (главная) функция модуля. При необходимости остальные функции модуля могут быть вызваны из главной функции.

Более подробная информация о файлах-функция и файлах-сценариях содержится в *13,14].

18

Типы данных MATLAB

ВMATLAB определены следующие основные встроенные классы вычислительных объектов

иобъектов управления (см. рисунок 1.7):

Массив(ARRAY)

обычный или разреженный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

logical

 

 

char

 

 

 

NUMERIC

 

 

 

 

cell

 

 

 

 

structure

 

 

 

function handle

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int8, uint8,

 

 

 

single

 

 

 

double

 

 

 

 

 

классы

 

классы Java

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пользователя

 

 

 

 

 

 

int16, uint16,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int32, uint32,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int64, uint64

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 1.7 – Классы (типы данных) MATLAB

-double – числовые массивы с числами удвоенной точности (все числовые данные по умолчанию имеют тип double);

-single – числовые массивы с числами одинарной точности;

-int64, uint64 – массивы 64-разрядных чисел со знаком и без знаков;

-int32, uint32 – массивы 32-разрядных чисел со знаком и без знаков;

-int16,uint16 – массивы 16-разрядных целых чисел со знаком и без знаков;

-int8, uint8 – массивы 8-разрядных целых чисел со знаками и без знаков;

-char – строчные массивы с элементами-символами;

-logical – логические массивы, содержащие значения 1 ("истина") или 0 ("ложь");

-struct – массивы структур с полями, которые также могут содержать массивы;

-сеll – массивы ячеек; ячейки, в свою очередь, тоже могут быть массивами;

-sparse – наследует свойства double, разреженные матрицы с элементами-числами удвоенной точности;

-date – работа с данными, представляющими собой дату и время;

-function_handle – дескрипторы функций.

MATLAB – система, специально предназначенная для осуществления вычислений с векторами, матрицами и полиномами. Под вектором в MATLAB понимается одномерный массив чисел, а под матрицей – двумерный массив. При этом следует четко понимать, что вектор, векторстрока, вектор-столбец или тензор – это математические объекты, а одномерный или двумерный массив – структура данных, предназначенная для хранения этих объектов в рамках программы

[15,16].

По умолчанию предполагается, что любая (!) заданная переменная является вектором или матрицей (в терминах программы – массивом). Например, отдельное заданное число (скаляр) система воспринимает как матрицу размером 1х1 (массив из одной строки и одного столбца), а вектор-строку из N элементов – как матрицу размером 1хN (одномерный массив).

19

Массив, имеющий более двух измерений, называется многомерным массивом. Многомерный массив в MATLAB обычно рассматривается как расширение двумерного массива. В случае трехмерного массива третье измерение условно называется "страницей".

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

Переменная в MATLAB создается, когда ей присваивается значение. Ниже приведены некоторые примеры формирования и инициализации числовых переменных, значения которых хранятся в одномерных и многомерных массивах:

 

Размерность

 

Оператор

переменной,

Комментарии

 

тип

 

A = 1

1 x 1

Создается переменная-скаляр A (матрица размером 1х1)

 

double

 

B = [1 2 3 4 5]

1 x 5

Вектор-строка B из 5 элементов. Значения строки массива

 

double

разделяются пробелом. Квадратные скобки являются

 

 

конструктором числового массива

C = uint8([1; 2; 3; 4; 5.4])

5 x 1

Вектор-столбец из 5 беззнаковых целых чисел. Значения

 

uint8

различных строк разделяются знаком " ; ". Округление до

 

 

целого выполняется по математическим правилам

[1 2 3 4 5]

1 x 5

Вектор-строка из 5 элементов записывается в специальную

 

 

системную переменную ans, поскольку оператор не

 

 

содержит знака присваивания. Полученное значение

 

 

переменной ans может использоваться в следующих

 

 

операторах вычислений

D = uint32([1; 2; 3; 4; 5])

5 x 1

Вектор-столбец из 5 элементов

 

uint32

 

E = [1 2 3 4 5]'

5 x 1

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

 

double

транспонирования (знак " ' ") вектора-строки

F = [1.0 2 3.9 14 -5]''

5 x 1

Вектор-строка из 5 элементов получается путем двойного

 

double

транспонирования вектора-строки

G = [1 2; 3 4; 5 6]

3 x 2

Матрица из 3-х строк и 2-х столбцов. Значения различных

 

double

строк разделяются знаком ";"

H = [1 2 3; 4 5 6; 7 8 9];

3х3х2

Сначала создается двумерный массив H(3х3). Затем

H(:, :, 2) = [1 0 4; 5 4 3; 2 3 4]

double

инициализируются значения второй страницы (добавляется

 

 

третье измерение). Результат – трехмерный массив из 3-х

 

 

строк, 3-х столбцов и 2 "страниц"

I = [B F]

1 x 10

Вектор-строка из 10 элементов. Сначала последовательно

 

double

заносятся 5 элементов вектора B, затем – 5 элементов

 

 

вектора F

J = [B; F]

2 x 5

Матрица из 2-х строк и 5 столбцов. Первая строка – элементы

 

double

вектора B, вторая строка – элементы вектора F

K = [1 2; ; 5 6]

2x2

Неинициализированные строки автоматически удаляются из

 

double

матрицы. Данный оператор эквивалентен "А=*1 2; 5 6]"

L = [1 2; 3; 5 6]

Ошибка

Количество значений для строк не соответствует количеству

 

 

значений для столбцов

 

 

20

 

Размерность

 

Оператор

переменной,

Комментарии

 

тип

 

M = [-0.1 : 0.3 : 1.4]

1х6

Вектор-строка *-0.1 0.2 0.5 0.8 1.1 1.4]. Задается начальным

 

double

значением, шагом, конечным значением.

N = zeros(4, 6)

2x6

Матрица из 4-х строк и 6 столбцов, содержащая нулевые

 

double

элементы

O = ones(3, 5, 2)

3x5x2

Трехмерный массив размерностью 3х5х2 элементов,

 

double

содержащий единичные элементы

P = rand(10)

10x10

Матрица размером 10х10 элементов, равномерно

 

double

распределенных в диапазоне от 0 до 1

R = 2*ones(4)

4x4

Матрица размером 4x4 элемента, все значения которой

 

double

равны 2

S = eye(2)

2x2 double

Единичная матрица S размером 2x2 элемента (единицы

T = repmat(R, 2, 3)

4x6 double

расположены на главной диагонали.

 

 

Матрица T размером 4x6 элементов, которая получается

 

 

путем дублирования матрицы S 2 раза по вертикали и 3 раза

 

 

по горизонтали

Кроме числовых типов данных в MATLAB реализована поддержка символьных данных, записей (структур) и ячеек.

Строка в MATLAB представляет собой одномерный массив (вектор), компоненты которого содержат числовые коды символов. Код каждого символа при хранении занимает 2 байта памяти. Один символ хранится в массиве размером 1х1, строка из N символов – в массиве размером 1xN (класс char). Массив объектов типа char может хранить несколько строк, причем все строки должны быть одинаковой длины, например:

name = ['Ivanov S.P. '; ...

'Morkovkin A.V. '; ...

'Cheremushkin K.D.'];

Как видим, в случае, если строки имеют различную длину, то они должны быть дополнены пробелами до длины самой длинной строки. Избежать данных проблем помогает использование массива ячеек (Cell Array).

Если обычный массив MATLAB содержит данные одного типа, то массив ячеек – это массив, элементами которого являются ячейки, которые сами могут содержать любой тип массива, в том числе и массив ячеек. Массивы ячеек позволяют хранить массивы с элементами данных разных типов. Создание массива ячеек может выполняться при инициализации содержимого ячеек (см. ниже), а может быть выполнено путем вызова функции вида:

D = cell(100, 1);% создание одномерного массива ячеек из 100 элементов (ячеек)

Массивы записей (структур) – это тип массивов в системе MATLAB, в котором разрешается сосредоточивать в виде записей разнородные данные (т. е. данные разных типов (классов)). Отличительной особенностью таких массивов является наличие именованных полей. Как и

21

вообще в MATLAB, массивы записей не объявляются. Отдельные экземпляры этого класса создаются автоматически при задании конкретных значений полям записи:

FIO.family = 'Ivanov';

FIO.name = 'Ivan';

FIO.surname = 'Ivanovich';

FIO.god = 1990

или путем использования оператора struct:

<имя записи> = struct('<имя поля1>', <значение1>, '<имя поля2>', <значение2>, ...).

Например:

FIO = struct('family','Ivanov,'name','Ivan','surname','Ivanovich','god', 1990)

При создании массива записей новые записи добавляются путем указания соответствующего индекса:

FIO(2).family = 'Petrov';

FIO(2).name = 'Petr';

FIO(2).surname = 'Petrovich';

FIO(2).god = 1996;

Если к какому-либо из элементов массива записей (структуры) добавляется значение нового поля, то же поле автоматически появляется во всех остальных элементах, хотя значение этого поля у других элементов при этом остается пустым.

Чтобы установить, какому классу принадлежит объект, используется функция class(). Вопросы использования объектно-ориентированного программирования при обработке

данных на языке MATLAB выходят за рамки данного краткого введения и детально рассмотрены в

[13, 17].

Доступ к элементам массивов, ячеек и структур данных

Обращение к элементам массива осуществляется путем указания индекса. Использование диапазонов значений индексов позволяет получить доступ к подмассиву исходного массива [18]. Примеры доступа к отдельным элементам описанных ниже переменных A и B, приведены в таблице:

A = [1 2 3 4; 5 6 7 8; 9 10 11 12];

B = [1.1 -2.1 3.4 4.5 5.8; 6.7 7.9 8.4 9.6 10.2];

Оператор

Размерность

Комментарии

результата

 

 

A(2,3)

1x1

В системную переменную ans заносится значение элемента

 

 

массива, расположенного на пересечении второй строки и

 

 

22

Оператор

Размерность

Комментарии

результата

 

 

 

 

третьего столбца

C = A(1:2,3:4)

2x2

В переменную C заносится подматрица, состоящая их элементов

 

 

правого верхнего угла матрицы А: [3 4; 7 8]

D = B(1, :)

1x5

В вектор-строку D заносятся все элементы первой строки

 

 

матрицы B

E = [A(2:3,2:3) B]

2x7

В матрицу E заносится подматрица матрицы A, а затем к ней

 

 

слева "приписывается" матрица B

A(:, 1) = 0

размерность

Первый столбец матрицы A заполняется нулями

 

матрицы A

 

F = zeros(10);

10x10

Результатом является матрица F размером 10x10 элементов,

H = ones(2);

 

четыре центральных элемента которой равны 1, а остальные 0.

F(5:6,5:6) = B

 

 

При "переинициализации" переменной (всей переменной, а не ее части!) матрицей другого размера, размер переменной автоматически корректируется.

Хранение матрицы в MATLAB осуществляется по столбцам, сверху-вниз. Поэтому к каждому элементу, например, двумерной матрицы можно получить доступ, либо два индекса (номер строки и номер столбца), либо указав номер элемента в "линейной развертке" матрицы.

При доступе к элементам многомерного массива сначала указывается номер строки, затем номер столбца, затем номер "страницы" (для трехмерного массива), как показано на рисунке 1.8. Понятно, что количество индексов должно соответствовать размерности массива.

Рисунок 1.8 – Индексы элементов многомерного (трехмерного) массива в MATLAB

При этом MATLAB позволяет получить доступ не только к одному элементу массиву, но и к целой строке, столбцу, странице и т.д., как это показано на рисунке 1.9. Чтобы реализовать такой режим доступа необходимо зафиксировать один или несколько из индексов (т.е. указать в них конкретные значения), а вместо остальных значений индексов указать знак ":" или необходимый диапазон значений, например, "1:3".

23

Рисунок 1.9 – Доступ к "странице" трехмерного массива в MATLAB

Доступ к элементам массива ячеек (в отличие от доступа к элементам массива) обычно осуществляется путем указания индекса в фигурных скобках, например:

C{1,1} = 'Ivanov S.P.';

C{1,2} = [1 2 3 4 5];

C{2,1} = [1 2 3; 4 5 6; 7 8 9];

C{2,2} = uint8(1:1:10);

Для символьного и графического отображения массива ячеек используются функции celldisp() и cellplot().

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

Непосредственное использование в расчетах классов cell и struct затруднительно, тем не менее они используются в MATLAB для хранения информации, а также при создании новых классов объектов.

Виды операций над массивами

Операции с массивами в MATLAB можно разделить на 2 группы [13]:

-векторные (матричные) операции, выполняемые по правилам математики. К таким операциям относятся сложение векторов, вычитание векторов, транспонирование вектора, умножение вектора на число, умножение двух векторов (определено только когда один из векторов – строка, а другой – столбец и оба вектора имеют одинаковое количество элементов, в зависимости от порядка операндов результатом может быть либо число, либо квадратная матрица), векторное произведение (определено только трехкомпонентных векторов, вызывается как функция);

-математические операции над элементами массивов. К таким операциям относятся все элементарные математические функции MATLAB от одного аргумента (например, sin(x), exp(x) и т.п., где x – матрица произвольной размерности) и некоторые стандартные математические операции (прибавление числа ко всем элементам матрицы, поэлементное умножение матриц (оператор ".*"), поэлементное деление матриц (оператор ".\"), поэлементное возведение

24

Соседние файлы в папке Теория фильтрации Лаба4