Самоучитель по Matlab

         

Частные каталоги


Для записи m-файлов используются каталоги, называемые

родительскими каталогами.

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

Однако начиная с версии MATLAB 5.0 появилась возможность в родительских каталогах создавать

частные каталоги

с именем PRIVATE. Расположенные в них m-файлы доступны только файлам родительского каталога. Файлы частных каталогов просматриваются интерпретатором системы MATLAB в первую очередь. Применение частных каталогов позволяет изменять исходные файлы, сохраняя оригиналы в родительском каталоге в неизменном виде.

Если вы решили отказаться от применения измененного файла, достаточно стереть его в частном каталоге. Такая возможность связана с тем, что интерпретатор при поиске m-файла прежде всего просматривает частный каталог и интерпретирует найденный в нем файл. И только если файл не найден, ищется файл в родительском каталоге.



Циклы типа for...end


Циклы типа for...end обычно используются для организации вычислений с заданным числом повторяющихся циклов. Конструкция такого цикла имеет следующий вид:

for vаг=Выражение. Инструкция. .... Инструкция end

Выражение чаще всего записывается в виде s:d:e, где s — начальное значение переменной цикла var, d — приращение этой переменной и е — конечное значение управляющей переменной, при достижении которого цикл завершается. Возможна и запись в виде s :е (в этом случае d=l). Список выполняемых в цикле инструкций завершается оператором end.

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

» for 1=1:5 i^2. end; 

ans =

ans =

ans =



ans =

16 

ans =

25

» for x=0:.25:1 Х

^

2, end: 

ans =

ans =

0.0625 

ans =

0.2500

ans =

0.5625 

ans =

1

Оператор continue передает управление в следующую итерацию цикла, пропуская операторы, которые записаны за ним, причем во вложенном цикле он передает управление на следующую итерацию основного цикла. Оператор break может использоваться для досрочного прерывания выполнения цикла. Как только он встречается в программе, цикл прерывается. Возможны вложенные циклы, например:

for i=1:3

for j=l:3

A(1.j)=i+j;

end 

end

В результате выполнения этого цикла (файл for2.m) формируется матрица А:

» for2 

» А

А =

2 3 4

3 4 5

4 5 6 

»

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

MATLAB допускает использование в качестве переменной цикла массива А размера

тхп.

При этом цикл выполняется столько раз, сколько столбцов в массиве А, и на каждом шаге переменная var представляет собой вектор, соответствующий текущему столбцу массива А:

» А=[1 2 3:4 5 6] 

А =

1 2 3

4 5 6 

» for var=A; var, end 

var =

1

var =

2

5

var=

3

6



Циклы типа while...end


Цикл типа while выполняется до тех пор, пока выполняется Условие:

while Условие Инструкции end

Пример применения цикла while уже приводился. Досрочное завершение циклов реализуется с помощью операторов break или continue.



Диалоговый ввод


Приведем простой пример диалоговой программы, которую легко поймут приверженцы доброго старого Бейсика:

%

Вычисление длины окружности с диалоговым вводом радиуса

r=0;

while r>=0,

r=input('Введите радиус окружностиr=');

if r>=0 disp(' Длина окружности l='); disp(2*pi*r), end 

end

Эта программа служит для многократного вычисления длины окружности по вводимому пользователем значению радиуса г. Обратите внимание на то, что здесь мы впервые показываем пример организации простейшего диалога. Он реализован с помощью команды input: MnputCВведите радиус окружности r='):

При выполнении этой команды вначале выводится запрос в виде строки, затем происходит остановка работы программы и ожидается ввод значения радиуса г (в общем случае числа). Ввод, как обычно, подтверждается нажатием клавиши Enter, после чего введенное число присваивается переменной г. Следующая строка

if r>=0 disp(' Длина окружности l = '); disp(2*pi*r);end

с помощью команды disp при r>=0 выводит надпись «Длина окружности 1=» и вычисленное значение длины окружности. Она представляет собой одну из наиболее простых управляющих структур типа if...end. В данном случае она нужна для остановки вычислений, если вводится отрицательное значение г (прием, который любят начинающие программисты).

Приведенные строки включены в управляющую структуру while...end. Это необходимо для циклического повторения вычислений с вводом значений r. Пока r>=0. цикл повторяется. Но стоит задать r<0, вычисление длины окружности перестает выполняться, а цикл завершается.

Если данная программа записана в виде m-файла circ.m, то работа с ней будет  выглядеть следующим образом:

» circ

Введите радиус окружности R=1 

Длина окружности l=

6.2832

Введите радиус окружности R=2 

Длина окружности l=

12.5664

Введите радиус окружности R=-1 

»

Итак, на примере даже простой программы мы видим пользу применения управляющих структур типа if...end и whi1e...end, а также функций диалогового ввода input('String') и вывода disp. Обратите внимание на завершение работы программы при вводе любого отрицательного числа для радиуса окружности.


Функция Input может использоваться и для ввода произвольных строковых выражений. При этом она задается в следующем виде:

input('Комментарий'. V)

При выполнении этой функции она останавливает вычисления и ожидает ввода строкового комментария. После ввода возвращается набранная строка. Это иллюстрирует следующий пример:

» S=input('Введите выражение ','s') Введите выражение (Вводим) 2*sin(l) 

S =

2*sin(l) 

» eval(S) 

ans = 

1.6829

Обратите внимание на то, что функция eval позволяет вычислить выражение, заданное (полученное от функции input) в символьном виде. Вообще говоря, возможность ввода любого символьного выражения в сочетании с присущими языку программирования MATLAB управляющими структурами открывает путь к созданию диалоговых программ любой сложности [

Нужно проявлять большую осторожность при применении eval и input, так как программы с их с использованием не всегда возможно компилировать. Впрочем, р-коды таких программ можно использовать с сервером run-time. — Примеч. ред.

].


Другие функции объектно-ориентированного программирования


Для получения списка методов данного класса объектов сейчас чаще используются функции methodsview и methods. Отличиями от what имя класса является то, что эти функции возвращают информацию также и о классах Java, но информация выводится в отдельном окне, не сообщается информация о папках, все методы из всех папок собраны вместе, и повторяющиеся имена методов удалены:

methodsview имя класса или methods имя класса -full — в отдельном окне возвращают полное описание методов класса, включая информацию о наследовании, а для классов Java — и о подписях и атрибутах;

M=methods ('имя класса',' -full ') — возвращает ту же информацию в массиве ячеек М;

M=methods(' имя класса ') — возвращает массив ячеек с перечислением методов, относящихся к заданному классу объектов;

methods имя класса возвращает перечень методов в отдельном окне. Пример:

» methods char Methods for class char: delete diff int

Следующие две функции могут использоваться только внутри конструкторов классов:

inferiorto (' CLASS1'. 'CLASS2'....) и superiortot 'CLASS1', 'CLASS2'....)

Они определяют низший и высший приоритеты классов по отношению к классу конструктора. Для дескрипторов перегружаемых функций существует функция

functions

F=functions(дескриптор функции),

возвращающая массив структур F. METHODS, вложенный в массив F, при этом именем поля в массиве F. METHODS является имя класса, а значением поля — название метода, который вызывается тогда, когда входной аргумент принадлежит этому классу.

Дополнительно functions возвращает следующие поля: F.function — строка, используемая для создания дескриптора функция (существуют также отдельная функция func2str для получения этой информации и обратная ей функция str2func, превращающая строку в дескриптор функции); F.type содержит simple (простая), overloaded (перегружаемая) или subfunction (подфункция), т. е. указывает тип

функции; F.default указывает путь к тому файлу, который первый в алгоритме поиска MATLAB и не определен никаким классом.


which имя метода — находит загруженный Java класс и все классы MATLAB, которым принадлежит данный метод;

 which -all имя метода — находит все классы, которым принадлежит данный метод.

Любой оператор в системе MATLAB можно

переопределить

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

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


Двойственность операторов, команд и функций


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

Функция

преобразует одни данные в другие. Для многих функций характерен возврат значений в ответ на обращение к ним с указанием списка входных параметров — аргументов. Например, говорят, что функция

sin(x)

в ответ на обращение к ней возвращает значение синуса аргумента

х.

Поэтому функцию можно использовать в арифметических выражениях, например

2*sin(x+1).

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

f_nаmе(Список_параметров).

Тем самым мы исключаем искусственное выделение имен функций большими (заглавными) буквами, принятое в справочной системе MATLAB. Напоминаем, что как в командной строке, так и в текстах m-файлов функции записываются только малыми буквами. Для функций, возвращающих ряд значений или массивов (например X, Y, Z,...), запись имеет следующий вид: [X. Y, Z. ...]=f_name(Cписок_параметров)

Важное значение имеет

двойственность

операторов и функций. Многие операторы имеют свои аналоги в виде функций. Так, например, оператор «+» имеет аналог в виде функции sum. Команды, записанные в виде

Command argument

нередко имеют форму записи и в виде функции:

Command(' argument')

Примеры:

» help sin SIN Sine.

SIN(X) is the sine of the elements of X. 

Overloaded methods

help sym/sin.m

» help('sin') SIN Sine.

SIN(X) is the sine of the elements of X.

 Overloaded methods

help sym/sin.m

» type('sin')

sin is a built-in function.

» type sin

sin is a built-in function.

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



Функции подсчета числа аргументов


При создании функций со специальными свойствами весьма полезны две приведенные ниже функции:

nargin — возвращает число входных параметров данной функции; 

nargout — возвращает число выходных параметров данной функции.

Пусть, к примеру, мы хотим создать функцию, вычисляющую сумму квадратов пяти аргументов xl, х2, хЗ, х4 и х5.

Обычный путь состоит в следующем — создаем функцию с именем sum2_5:

function f=sum2_5(x1,x2,x3,x4,x5) ;

f=x1^2+x2^2+x3^2+x4*2+x5^*2;

Теперь проверим ее в работе:

» sum2_5(l,2.3.4.5) 

ans = 

55

» sum2_5(l,2)

??? Input argument 'хЗ' is undefined. 

Error in ==> C:\MATI_AB\bin\sum2_5.m 

On line 2 ==> f=x1^2+x2^2+x3^2+x4^2+x5^2;

Итак, при наличии всех пяти аргументах функция работает корректно. Но если аргументов менее пяти, она выдает сообщение об ошибке. С помощью функции nargin можно создать функцию sum2_5m, которая работает корректно при любом числе заданных входных аргументов в пределах от 1 до 5:

f

unction f=sum2m_5(x1 ,x2 , хЗ ,x4 , x5) ;

n=nargin;

if n==1 f=x1^2; end

if n==2 f=x1^2+x2^2;end

if n==3 f=x1^2+x2^2+x3^2; end

if n==4 f=x1^2+x2

^

2+x3^2+x4

^

2: end

if n==5 f=x1^2+x2^2+x3^2+x

В данной функции используется условный оператор i f...end, который будет детально описан далее. Но и без этого ясно, что благодаря применению функции nargin и условного оператора вычисления всякий раз идут по формуле с числом слагаемых, равным числу входных аргументов — от одного до пяти. Это видно из приведенных ниже примеров:

» sum2_5m(1) 

ans = 

1

» sum2_5m(1,2) 

ans =

5

» sum2_5m( 1,2,3)

ans = 

14

» sum2_5m(1,2,3,4) 

ans =

30

» sum2_5m(1,2,3,4,5) 

ans=

55

» sum2_5m(1,2,3,4,5,6) 

??? Error using ==> sum2_5m 

Too many input arguments.

Итак, при изменении числа входных параметров от 1 до 5 вычисления проходят корректно. При большем числе параметров выводится сообщение об ошибке. Этс уже действует встроенная в интерпретатор MATLAB система диагностики ошибок



Функция lasterr и обработка ошибок


Опытные программисты должны предусматривать ситуации с появлением ошибок. К примеру, при

х =

0 выражение

sin(x)/x =

0/0 = 1 и правильным решением было бы вместо его вычисления использовать значение 1.

В данном простом примере приводится функция sdO, исключающая вычисление

sin(x)/x

при

х =

0:

function f=sdO(x) 

if x==0 f=1; 

else f=sin(x)/x; 

end 

return

При этом вычисления пройдут корректно при любом

х:

» sd0(l)

ans=

0.8415 

»sd0(0) 

ans = 

1

Для вывода сообщения о последней произошедшей ошибке служит функция lasterr (см. пример ниже):

» ааа

??? Undefined function or variable 'aaa'. 

» 2+3 

ans =

5

» 1/0

Warning: Divide by zero, 

ans =

Inf

» lasterr 

ans = Undefined function or variable 'aaa'.

Как нетрудно заметить, функция lasterr возвращает текстовое сообщение, следующее за знаками ??? сообщения об ошибке.

В общем случае программы могут содержать

обработчики ошибок,

направляющие ход вычислений в нужное русло, даже если появляется ошибка. Но для этого требуются средства индикации и обработки ошибок. Основными из них являются функции eval и l asterr. О функции lasterr уже говорилось, а функция eval (' try', 'catch') в отличие от ранее рассмотренной формы (урок 18) имеет два входных аргумента. Один из них — это строчное выражение, которое преобразуется в исполняемую форму и выполняется при отсутствии ошибки. Если же происходит ошибка, то строка ' catch' вызывает обращение к функции обработки ошибки.



Использование подфункций


Начиная с версии 5.0 в функции системы MATLAB можно включать

подфункции.

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

function [mean.stdev] = statv(x)

USTATV Interesting statistics.

%Пример функции с встроенной подфункций

n = length(x);

mean = avg(x.n);

stdev = sqrt(sum((x-avg(x.n)).

^

2)/n);

%--------------------------------------

function m = avg(x.n) £Mean subfunction m = sum(x)/n;

В этом примере среднее значение элементов вектора х вычисляется с помощью подфункции avg(x.n), тело которой записано в теле основной функции statv. Пример использования функции statv представлен ниже:

» V=[l 2345]

V=

12345 

» [a,m]=statv(V)

 а =

m =

1.4142 » statv(V) 

ans =

3

» help statv

STATV Interesting statistics. 

Пример функции с встроенной подфункций

Подфункции определены и действуют локально, т. е. только в пределах т-файла, определяющего основную функцию. Команда help пате выводит комментарий, относящийся только к основной функции, тогда как команда type name выводит весь листинг m-файла. Так что заданные в некотором m-файле подфункции нельзя использовать ни в командном режиме работы, ни в других т-файлах. При обращении к функции интерпретатор системы MATLAB прежде всего просматривает m-файл на предмет выявления подфункций. Если они обнаружены, то задаются как локальные функции. Благодаря локальному действию подфункций их имена могут совпадать с именами основных функций системы. Если в функции и подфункциях должны использоваться общие переменные, их надо объявить глобальными как в функции, так и в ее подфункциях.



Как отмечалось, команда help name,


Как отмечалось, команда help name, где name — имя m-файла, обеспечивает чтение первой строки с текстовым комментарием и тех строк с комментариями, которые следуют непосредственно за первой строкой. Комментарий, расположенный за пределами этой области, не выводится. Это позволяет создавать невыводимый программный комментарий, например: Z=X+Y ^Массив Z является суммой массивов X и Y
Пустая строка прерывает вывод комментария при исполнении команды help name. Команда type name выводит текст программы со всеми комментариями, в том числе и следующими после пустых строк.
Команда help catalog, где catalog — имя каталога с m-файлами, позволяет вывести комментарий, общий для всего каталога. Такой комментарий содержится в файле
contents.m, который пользователь может создать самостоятельно с помощью редактора m-файлов. Если такого файла нет, то будет выведен список первых строк комментариев для всех m-файлов каталога.

Конструкция переключателя


Для осуществления множественного выбора (или ветвления) используется конструкция с переключателем типа switch:

switch switch_Bыражение 

case саsе_Выражение 

Список_инструкций

case {саsе_Выражение1, Саsе_выражение2, саsе_ВыражениеЗ....} 

Список_инструкций

otherwise. Список_инструкций end

Если выражение после заголовка switch имеет значение одного из выражений са5е_Выражение..., то выполняется блок операторов case, в противном случае — список инструкций после оператора otherwise. При выполнении блока case исполняются те списки инструкций, для которых сазе_Выражение совпадает со switch_Bbipa-жением. Обратите внимание на то, что сазе_Выражение может быть числом, константой, переменной, вектором ячеек или даже строчной переменной. В последнем случае оператор case истинен, если функция strcmp (значение, выражение) возвращает логическое значение «истине».

Поясним применение оператора switch на примере m-файла swl.m:

switch van 

case {1,2,3}

dispCПервый квартал') 

case {4,5,6}

disp('Второй квартал') 

case {7,8,9}

d.isp( 'Третий квартал') 

case {10.11,12}

dispC Четвертый квартал') 

otherwise

disp('Ошибка в задании') 

end

Эта программа в ответ на значения переменной van — номера месяца — вычисляет, к какому кварталу относится заданный месяц, и выводит соответствующее сообщение:

» var=2;

» swl

Первый квартал 

» var=4;swl 

Второй квартал 

» var=7:swl 

Третий квартал 

» var=12;swl 

Четвертый квартал

» var=-l;swl 

Ошибка в задании



Конструкция try...catch...end


В MATLAB 6 введена новая конструкция блока вывода ошибок try...catch...end:

try.

Список инструкций

Список инструкций catch.

Список инструкций

...

Список инструкций 

end

Эта конструкция выполняет все списки инструкций. Если в каком-то списке до оператора catch появляется ошибка, то выводится сообщение об ошибке, но системная переменная последней ошибки lasterr не меняется. В сообщениях после catch сообщения об ошибке не выводятся.

В следующем примере задано появление ошибки (переменная ааа не определена), после чего выполняется блок try...catch...end:

ааа

??? Undefined function or variable 'ааа'.

try

2+3:

3+4:

2/0: catch

4+5: end:

Warning: Divide by zero. 

»lasterr ans = Undefined function or variable 'aaa'.

Обратите внимание, что в конце блока команда lasterr выводит ее начальное значение. А в другом примере ошибка задана в блоке try...catch...end уже после оператора catch:

» try

2+3:

3+4;

4+5: catch

5/0: 

end:

» lasterr

ans = Undefined function or variable 'aaa'.

Как нетрудно заметить, на этот раз ошибка в вычислении 5/0 не выводится, а значение lasterr осталось тем, что было изначально.



Некоторые ограничения


Поскольку язык программирования системы MATLAB ориентирован на структурное программирование, в нем нет номеров строк (присущих до недавнего времени Бейсику) и программных операторов безусловного перехода GO TO. Имеются лишь управляющие структуры следующих типов: условных выражений if... el se...elseif...end, циклы for...end и while...end. Их форма похожа на ту, которая используется в языке Pascal (т. е. область действия управляющих структур начинается их заголовком, но без слова begin, а заканчивается словом end). С позиций теории структурного программирования этих средств достаточно для решения любых задач. В MATLAB имеются также операторы-переключатели типа case.

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

Программирование простых задач в среде MATLAB очень напоминает программирование на Бейсике. Во многих случаях программы на Бейсике можно почти дословно перевести на язык системы, учтя небольшие отличия в синтаксисе этих языков. Это нельзя трактовать как отсутствие у языка MATLAB индивидуальных черт. Любители Си, Паскаля или Фортрана также заметят сходство этих языков с языком программирования MATLAB. Так что правильнее считать, что этот язык имеет вполне самостоятельное значение. Он вобрал в себя лучшие средства универсальных языков программирования.



Основные понятия программирования


До сих пор мы в основном использовали систему MATLAB в режиме непосредственного счета —

в командном режиме.

Однако при решении серьезных задач возникает необходимость сохранения используемых последовательностей вычислений, а также их дальнейшей модификации. Иными словами, существует необходимость

программирования

решения задач.

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

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

языка программирования

системы.

Большинство объектов этого языка, в частности все команды, операторы и функции, одновременно являются объектами

входного языка

общения с системой в командном режиме работы. Так что фактически мы приступили к описанию языка программирования системы MATLAB с первых строк данной книги.

Так в чем же отличие входного языка от языка программирования? В основном — в способе фиксации создаваемых ими кодов. Сессии в командном режиме работы не сохраняются в памяти компьютера (ведение дневника не в счет). Хранятся только определения созданных в ходе их выполнения переменных и функций. А вот программы на языке программирования MATLAB сохраняются в виде текстовых m-файлов. При этом могут сохраняться как целые программы в виде файлов-сценариев, так и отдельные

программные модули —

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

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

проблемно-ориентированным

языком программирования высокого уровня. Точнее говоря, это даже язык

сверхвысокого

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

а к операторам — операторы построения разнообразных графиков, генерации матриц определенного вида и т. д.



Основные средства программирования


Итак, программами в системе MATLAB являются m-файлы текстового формата, содержащие запись программ в виде программных кодов. Язык программирования системы MATLAB имеет следующие средства:

данные различного типа;

константы и переменные;

операторы, включая операторы математических выражений;

встроенные команды и функции;

функции пользователя;

управляющие структуры;

системные операторы и функции;

средства расширения языка.

Коды программ в системе MATLAB пишутся на языке высокого уровня, достаточно понятном для пользователей умеренной квалификации в области программирования. Язык программирования MATLAB является типичным

интерпретатором.

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

Интерпретация означает, что MATLAB не создает исполняемых конечных программ. Они существуют лишь в виде m-файлов. Для выполнения программ необходима среда MATLAB. Однако для программ на языке MATLAB созданы компиляторы, транслирующие программы MATLAB в коды языков программирования С и C++. Это решает задачу создания исполняемых программ, первоначально разрабатываемых в среде MATLAB. Компиляторы для системы MATLAB являются вполне самостоятельными программными средствами и в данной книге не рассматриваются.

Следует особо отметить, что не все инструкции MATLAB могут компилироваться, так что перед компиляцией программы нуждаются в некоторой доработке. Зато скорость выполнения откомпилированных программ порой возрастает в 10-15 раз (правда, это достигается, как правило, для простых примеров с большими циклами).

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



Основные типы данных


Структура типов данных системы MATLAB представлена ниже:

Типы данных array и numeric являются

виртуальными

(«кажущимися»), поскольку к ним нельзя отнести какие-либо переменные. Они служат для определения и комплектования некоторых типов данных. Таким образом, в MATLAB определены следующие основные типы данных, в общем случае представляющих собой многомерные массивы:

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

double — числовые массивы с числами удвоенной точности; 

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

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

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

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

function_handle — дескрипторы функций:

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

intl6,uint!6 — массивы 16-разрядных целых чисел со знаком и без знаков; 

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

Кроме того, предусмотрен еще один тип данных — UserObject, который относится к типам данных (объектом), определяемым пользователем. Типы данных double, char и sparse были рассмотрены ранее, так что в этой главе будут детально рассмотрены оставшиеся типы. Что касается чисел класса uint8, то они представляют значения от 0 до 255 и занимают в памяти 1/8 часть от размера одного числа с двойной точностью. В основном этот тип данных применяется в служебных целях.

Каждому типу данных можно соотнести некоторые характерные для него операции, называемые

методами.

Дочерние типы данных, расположенные на приведенной диаграмме ниже родительских типов, наследуют от последних их методы, что является признаком наследования объектов. Поскольку в иерархии типов данных сверху находятся данные типа array, это значит, что все виды данных в MATLAB являются массивами.



Особенности выполнения m-файлов функций


М-файлы-функции могут использоваться как в командном режиме, так и вызываться из других M-файлов. При этом необходимо указывать все входные и выходные параметры. Исключением является случай, когда выходной параметр единственный — в этом варианте функция возвращает единственный результат и может использоваться в математических выражениях. При использовании глобальных переменных они должны быть объявлены во всех m-файлах, используемых в решении заданной задачи, и во всех входящих в них встроенных подфункциях.

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

Если аргумент функции используется только для вычислений и его значения не меняются, то аргумент передается ссылкой, что уменьшает затраты памяти. В других случаях аргумент передается значением. Для каждой функции выделяется своя (рабочая) область памяти, не входящая в область, предоставляемую системе MAT-LAB. Глобальные переменные принадлежат ряду областей памяти. При их изменении меняется содержимое всех этих областей.

При решении задач с большим объемом данных может ощущаться нехватка оперативной памяти. Признаком этого становится появление сообщения об ошибке «Out of memory».

В этом случае может быть полезным применение следующих мер:

стирание ставших ненужными данных, прежде всего больших массивов;

увеличение размеров файла подкачки Windows;

уменьшение размера используемых данных;

снятие ограничений на размеры используемой памяти;

увеличение объема физической памяти компьютера.

Чем больше емкость ОЗУ компьютера, на котором используется система MATLAB тем меньше вероятность возникновения указанной ошибки. Опыт показывает, что даже при решении задач умеренной сложности емкость ОЗУ не должна быть менее 16-32 Мбайт.



Переменные varargin и varargout


Для упрощения записи аргументов функций их можно представить списком, который определяет специальная переменная varargin, являющаяся массивом ячеек. Она должна записываться строчными буквами и может включать в себя как аргументы, так и опции функций. Например, в приведенных ниже примерах:

function myplot(x,varargin)

plot(x,varargin{:}) function [s,varargout] = mysize(x)

nout = max(nargout.1)-1;

s = size(x);

for 1=1:nout, varargout(i) = {s(i)}; end

Эта переменная вбирает в себя все входные параметры и опции начиная со второго аргумента. При обращении к данной функции

myplot(sin(0:.1:1),'color'.[.5 .7 ,3],'linestyle',':')

varargin представляет массив ячеек размера 1x4, включающий а себя значения

'color', [.5 .7 .3], 'linestyle' u ':'.

Аналогично varagin переменная varargout объединяет любое число

выходных

параметров в массив ячеек. Эта переменная, кстати, как и varargin, должна быть последней в списке аргументов. Обычно эта переменная не создается при вызове функций. Приведенный ниже пример поясняет ее создание с помощью цикла:

function [s,varargout] = rnysize(x) 

nout = max(nargout,l)-l: 

s = size(x); 

for i=1:nout. 

varargout(i)= (s(i)}: end

Более подробно циклы будут рассмотрены в дальнейшем описании. В данном случае цикл использован для объединения всех параметров начиная со второго в значение переменной varargout.



Понятие об объектно-ориентированном программировании


Мы уже много раз упоминали различные

объекты

языка программирования системы MATLAB. Это является одним из признаков

объектно-ориентированного программирования

(ООП), причем чисто внешним. В основе объектно-ориентированного программирования лежат три основных положения.

Инкапсуляция —

объединение данных и программ и передача данных через входные и выходные параметры функций. В результате появляется новый элемент программирования —

объект.

Наследование

— возможность создания родительских объектов и новых дочерних объектов, наследующих свойства родительских объектов. Возможно также

множественное

наследование, при котором класс наследует свойства

нескольких

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

Полиформизм —

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

В дополнение к этим положениям объектно-ориентированное программирование в MATLAB допускает

агрегирование

объектов, т. е., объединение частей объектов или ряда объектов в одно целое.

Объект можно определить как некоторую структуру, принадлежащую к определенному

классу.

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

double — числовые массивы с элементами-числами двойной точности;

sparse — двумерные числовые или комплексные разреженные матрицы;

char — массивы символов;

struct — массивы структур (записей);

cell — массивы ячеек;

javaarray

массивы Ява;

functionjnandle — дескрипторы функций.

С объектами этих классов мы многократно встречались, особо не оговаривая их принадлежность к объектно-ориентированному программированию. Для MATLAB вообще характерно, что никакие классы объектов (в том числе заново создаваемые) не требуют объявления. Например, создавая переменную nаmе='Иван', мы автоматически получаем объект в виде переменной name класса char. Таким образом, для переменных принадлежность к тому или иному классу определяется их значением. Является ли переменная объектом, можно определить при помощи функции isobject(HMfl переменной). Аналогичная функция isjava определяет, является ли переменная объектом Java.


Для создания новых классов объектов служат

конструкторы классов.

По существу, это m-файлы, имена которых совпадают с именами классов @Имя_класса, но без символа @. Этим символом помечаются подпапки системы MATLAB, в которых имеются конструкторы классов. Множество таких папок с примерами конструкторов классов вы найдете в подпапках MATLAB\TOOLBOX.

В качестве примера рассмотрим поддиректорию @SYM в директории TOOLBOX\ SYMBOLIC. В этой поддиректории можно найти конструкторы для более чем сотни объектов пакета символьной математики. К примеру, конструктор функции, вычисляющей арктангенс, выглядит следующим образом:

» help @sym/atan.m 

ATAN Symbolic inverse tangent. 

» type @sym/atan,m

 function Y = atan(X) 

%ATAN Symbolic inverse tangent. 

%

Copyright (c) 1993-98 by The MathWorks. Inc. 

%

SRevision: 1.10 $ $Date: 1997/11/29 01:05:16 $ 

Y = mapleCmap' ,'atan' .X);

В данном случае для конструирования нужного объекта используется функция mapl e, дающая вход в ядро системы символьной математики Maple V R4, которое поставляется в составе системы MATLAB по лицензии фирмы MapleSoft, Inc. Этот пример, кстати, наглядно показывает, что пользователь системы MATLAB может существенно расширить число объектов класса sym, поскольку ядро системы Maple V содержит намного больше определений, чем пакет символьной математики системы MATLAB. Для создания новых классов объектов служит функция class, описанная ниже.

Итак, объектно-ориентированное программирование — это как бы кинжал, закрепленный на вашем поясе. Вы можете и не воспользоваться этим оружием, ощущая при этом его значимость и ценя красоту. Но в альтернативном варианте вы можете использовать его во время ежедневной трапезы в качестве столь необходимого столового ножа. В первом случае вы выступаете в качестве обычного пользователя, а во втором — программиста-профессионала.

Пакеты прикладных программ системы MATLAB позволяют разработчикам с большим успехом использовать возможности объектно-ориентированного программирования путем создания новых классов и объектов. М-файлы системы представляют собой массу наглядных примеров объектно-ориентированного программирования на языке MATLAB. Это дает основание ограничиться справочным описанием основных средств такого программирования с приведением минимума простых примеров.


Проверка принадлежности объекта к заданному классу


Для контроля принадлежности заданного объекта к некоторому классу служит функция isa:

isa(OBJ. 'Имя_класса') — возвращает логическую 1, если OBJ принадлежит классу с указанным именем. Дополнительно к вышеописанным выделяет классы numeric и single. Но не обнаруживает класс logical. Нужно использовать функцию islogical, чтобы проверить принадлежность к этому классу.

Примеры применения этой функции:

» Х=[1 2 3]; 

» isa(X,'char') 

ans =

0

» isa(X,'double') 

ans =

1



Создание класса или объекта


Для создания класса объектов или объектов, а также для их идентификации служит функция class. Формы ее применения представлены ниже.

class (OBJ) — возвращает класс указанного объекта OBJ. Типы стандартных классов double, sparse, char, cell, struct, functionjiandle были перечислены выше. int8 — 8-разрядный массив целых чисел со знаком; uintS — 8-разрядный массив целых чисел без знака; intlG — 16-разрядный массив целых чисел со знаком; uint!6 — 16-разрядный массив целых чисел без знака; int32 — 32-разрядный массив целых чисел со знаком; uint32 — 32-разрядный массив целых чисел без знака; <class_name> — класс, определенный пользователем; <java_class> — имя класса Ява;

OBJ=class(S, 'classjiame' ,PARENT1,PARENT2....) — создает объект класса 'classname' на базе структуры S и родительских объектов PARENT1, PARENT2,... При этом создаваемый объект наследует структуру и поля родительских объектов. Объекту OBJ в данном случае присуще

множественное наследование;

OBJ=class(struct[ ]. 'classjiame' .PARENT1.PARENT2,...) — не может иметь никаких полей, кроме унаследованных от родительских объектов.

Обратите внимание на то, что эта функция обычно используется в составе m-файлов конструкторов классов объектов.



Создание паузы в вычислениях


Для остановки программы используется оператор pause. Он используется в следующих формах:

pause — останавливает вычисления до нажатия любой клавиши; 

pause(N) — останавливает вычисления на N секунд; 

pause on — включает режим отработки пауз; 

pause off — выключает режим отработки пауз. 

Следующий пример поясняет применение команды pause:

for i=1:20;

х =rand(1,40);

у =rand(1,40);

z = sin(x.*y);

tri = delaunay(x.y);

trisurf(tri,x,y,z)

paused);

end

Команда paused) здесь обеспечивает показ 20 рисунков — построений трехмерных поверхностей из треугольных окрашенных областей со случайными параметрами.



Создание Р-кодов


Когда встречается сценарий или функция в виде m-файла, то всякий раз выполняется трансляция файлов, создающая так называемые Р-коды (псевдокоды). Она связана с синтаксическим контролем сценария или функции, который несколько замедляет вычисления. Временные Р-коды хранятся в памяти только до использования команды clear или завершения сеанса работы. Кроме того, MATLAB позволяет явно создавать и хранить Р-коды сценариев и функций с помощью команды pcode: pcode имена_М-файлов

pcode *.m создает файлы р-кодов для всех m-файлов данной папки, pcode с дополнительным параметром - inplace — хранит эти файлы в тех же папках, что и исходные m-файлы.

Особенно полезно применение этой команды в том случае, когда используется сложная дескрипторная графика и средства создания GUI. В этом случае выигрыш по скорости выполнения вычислений может быть заметным. Переход к Р-кодам полезен, если пользователь желает скрыть созданный им m-файл и реализованные в нем идеи и алгоритмы. Файл с Р-кодами имеет расширение .р. Размер файла с Р-кодами обычно больше, чем размер m-файла.Рассмотрим следующий пример — создадим файл-сценарий pp.m следующего содержания:

told=cputime; 

х=-15:.0001:15; 

plot(x,sin(x)) 

t=cputime-told

Эта программа строит график функции

sin(x)

по большому числу точек. Кроме того, она вычисляет время выполнения данного сценария в секундах. При первом пуске получим:

» рр

t=

0.4400

Теперь выполним создание Р-кодов и вновь запустим программу:

» pcode рр 

» рр

t=

0.3900 

» рр 

t =

0.3300

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



Статус переменных и команда global


Итак, из сказанного ясно, что переменные в файлах-сценариях являются

глобальными,

а в файлах-функциях —

локальными.

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

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

Команда global varl var2... позволяет объявить переменные модуля-функции глобальными. Таким образом, внутри функции могут использоваться и такие переменные, если это нужно по условиям решения вашей задачи [

Чтобы несколько программных модулей могли совместно использовать глобальную переменную, i идентификатор должен быть объявлен как global во всех модулях.

].



Статус переменных в функциях


Переменные, указанные в списке параметров функции, являются

локальными

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

Эта особенность переменных-параметров хорошо видна при разборе примера, показанного на рис. 20.3. Здесь (признаемся, что неточно) задана некоторая функция двух переменных fun(x,

у).

В этом примере в окне редактора создана функция fun двух переменных х и у, вычисляющая z =

х

2

2

.

Поскольку переменные

х

и

у

указаны как параметры функции fun(x,

у),

то они являются локальными. В примере вне тела функции им заданы нулевые значения. Очевидно, что при вычислении значения fun(2, 3) в теле функции задается х=2 и у=3. Поэтому результат — z=13. Однако после выхода из тела функции переменные х и у принимают свои исходные значения, равные нулю. Так что эти переменные меняют свои значения на значения параметров функции только локально — в пределах тела функции.

А каков статус переменной z в нашем примере? Она, как и любая переменная, определенная в теле функции, также будет локальной. Изначально ее значение

не определено. В теле функции переменная принимает значение z=13. А после возврата из функции, как нетрудно увидеть из рис. 18.2, переменная z, несмотря на ее применение в теле функции, остается неопределенной. На это указывает сообщение, отображаемое после попытки вывода значения переменной z.

Рис. 20.3.

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

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

У нашей функции имеется один недостаток — вывод на индикацию значения z=13 из тела функции, хотя после этого

г

остается равным 0. Чтобы убрать побочный эффект вывода значения z, достаточно установить знак ; после математического выражения, определяющего z. Таким образом, окончательно наша функция должна записываться следующим образом:

function z=fun(x,y) 

z=x^2+y^2;

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



Структура и свойства файлов сценариев


Итак, мы установили, что работа в командном режиме (сессия) не является программированием. Внешним атрибутом последнего в MATLAB служит задание последовательности действий по программе, записанной в виде m-файла. В уроке 5 было показано, что для создания m-файлов может использоваться как встроенный редактор, так и любой текстовый редактор, поддерживающий формат ASCII. Подготовленный и записанный на диск m-файл становится частью системы, и его

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

Файл-сценарий,

именуемый также Script-файлом, является просто записью серии команд без входных и выходных параметров. Он имеет следующую структуру:

«Основной комментарий %Дополнительный комментарий Тело файла с любыми выражениями

Важны следующие свойства файлов-сценариев: 

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

работают с данными из рабочей области; 

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

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

Основным комментарием является первая строка текстовых комментариев, а дополнительным — последующие строки. Основной комментарий выводится при выполнении команд lookfor и help имя_каталога. Полный комментарий выводится при выполнении команды help Имя_файла. Рассмотрим следующий файл-сценарий:

%Plot with color red

%Строит график синусоиды линией красного цвета

выведенной масштабной сеткой в интервале [xmin.xmax]

x=xmin:0.1:xmax;

plot(x.sin(x).'r')

grid on

Первые три строки здесь — это комментарий, остальные — тело файла. Обратите внимание на возможность задания комментария на русском языке. Знак

%

в комментариях должен начинаться с первой позиции строки. В противном случае команда help name не будет воспринимать комментарий (иногда это может понадобиться) и возвратит сообщение вида No help comments found in-name.m.


Обратите внимание на то, что такой файл нельзя запустить без предварительной подготовки, сводящейся к заданию значений переменным xmin и хтах, использованным в теле файла. Это следствие первого свойства файлов-сценариев — они работают с данными из рабочей области. Переменные, используемые в файлах-сценариях, являются глобальными, т. е. они действуют одинаково в командах сессии и внутри программного блока, которым является файл-сценарий. Поэтому заданные в сессии значения переменных используются и в теле файла. Имена файлов-сценариев нельзя использовать в качестве параметров функций, поскольку

файлы-сценарии не возвращают значений. Можно сказать, что файл-сценарий — это простейшая программа на языке программирования MATLAB [

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

].





Рис.20.2.



Пример работы с файлом pcr


Структура М-файла-функции


М-файл-функция

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

function var=f_name(Cnncoк_napaмeтpов) 

%Основной комментарий

%Дополнительный комментарий 

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

vаr=выражение

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

он начинается с объявления function, после которого указывается имя переменной van — выходного параметра, имя самой функции и список ее входных параметров;

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

все переменные, имеющиеся в теле файла-функции, являются

локальными,

т. е. действуют только в пределах тела функции;

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

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

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

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

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

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

function [varl,var2....]=f_name(Список_параметров)

%Основной комментарий

%Дополнительный комментарий

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

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

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

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

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

[var1,va2,... ]=f_nаmе(Список_параметров)

После его применения переменные выхода varl, var2,... становятся определенными и их можно использовать в последующих математических выражениях и иных сегментах программы. Если функция используется в виде nаmе(Список_параметров), то возвращается значение только первого выходного параметра — переменной varl.



Управляющие структуры


Помимо программ с

линейной структурой,

инструкции которых исполняются строго по порядку, существует множество программ, структура которых

нелинейна.

При этом ветви программ могут выполняться в зависимости от определенных условий, иногда с конечным числом повторений — циклов, иногда в виде циклов, завершаемых при выполнении заданного условия. Практически любая серьезная программа имеет нелинейную структуру. Для создания таких программ необходимы специальные управляющие структуры. Они имеются в любом языке программирования, и в частности в MATLAB.



Условный оператор


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

if Условие 

Инструкции_1

elself Условие 

Инструкции_2 

else 

Инструкции_3 

end

Эта конструкция допускает несколько частных вариантов. В простейшем, типа! f...end: if Условие Инструкции end

Пока Условие возвращает логическое значение 1 (то есть «истина»), выполняются Инструкции, составляющие тело структуры if...end. При этом оператор end указывает на конец перечня инструкций. Инструкции в списке разделяются оператором , (запятая) или ; (точка с запятой). Если Условие не выполняется (дает логическое значение 0, «ложь»), то Инструкции также не выполняются.

Еще одна конструкция

if Условие 

Инструкции_1 

else 

Инструкции_2 

end

выполняет Инструкции_1, если выполняется Условие, или Инструкции_2 в противном

случае.

Условия записываются в виде:

Выражение_1 Оператор_отношения Выражение_2,

причем в качестве Операторов_отношения используются следующие операторы: ==, <, >, <=, >= или ~=. Все эти операторы представляют собой пары символов без пробелов между ними.

Мы уже неоднократно показывали применение этой общеизвестной управляющей структуры в программных модулях. Читателю предлагается опробовать собственные варианты программ с условным оператором.



Виды программирования


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

Язык программирования системы MATLAB вобрал в себя все средства, необходимые для реализации различных видов программирования:

процедурного;

операторного;

функционального;

логического;

структурного (модульного);

объектно-ориентированного;

визуально-ориентированного.

В основе

процедурного, операторного

и

функционального

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

Логическое

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

Зато MATLAB представляет собой яркий пример плодотворности

структурного

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

Объектно-ориентированное

программирование также широко представлено в системе MATLAB. Оно особенно актуально при программировании задач графики. Что качается

визуально-ориентированного

программирования, то в MATLAB оно представлено в основном в пакете моделирования заданных блоками устройств и систем Simulink. Этот пакет будет рассмотрен в конце книги. В ядре системы в данный момент визуально-ориентированное программирование не используется.



Вывод сообщений об ошибках


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

sin(x)/x —

при

х

= 0 имеет место ошибка вида «деление на ноль». При появлении ошибки вычисления могут завершиться досрочно с выводом сообщения об ошибке. Следует, однако, отметить, что не все ошибки вызывают остановку вычислений. Некоторые сопровождаются только выдачей предупреждающей надписи.

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

sd(x)=sin(x)/x,

в котором задано сообщение об ошибке на русском языке:

function f=sd(x)

if x==0 error('Ошибка - деление на 0'). end

f=sin(x)/x

Для выявления ситуации об ошибке использован оператор условного перехода if, который будет описан детально несколько позднее. Результат выполнения данной функции приводится ниже:

» sd(l) 

f =

0.8415 

ans =

0.8415 

» sd(0)

??? Error using ==> sd Ошибка - деление на 0

Если остановка программы при появлении ошибки нежелательна, то может использоваться команда вывода предупреждающего сообщения warning('Предупреждающее сообщение')

Эта команда выводит стоящее в апострофах сообщение, но не препятствует дальнейшей работе программы. Признаком того, что является ошибкой, а что — предупреждением, являются символы ??? и слово Warning в соответствующих сообщениях.