Автор работы: Пользователь скрыл имя, 10 Октября 2012 в 18:07, курс лекций
Работа содержит курс лекций по дисциплине "ФПрограммирование ии компьютеры" на тему: "Основы программирования в MatLab.doc"
Введение
Глава 1. Структура программы. Основные математические операции и типы данных
1.1. Структура программы пакета MatLab
1.2. Простые переменные и основные типы данных в MatLab
1.3. Арифметические операции с простыми переменными
1.4. Основные математические функции MatLab
1.5. Векторы и матрицы в MatLab
1.6. Операции над матрицами и векторами
1.7. Структуры в MatLab
1.8. Ячейки в MatLab
Глава 2. Условные операторы и циклы в MatLab
2.1. Условный оператор if
2.2. Условный оператор switch
2.3. Оператор цикла while
2.4. Оператор цикла for
Глава 3. Работа с графиками в MatLab
3.1. Функция plot
3.2. Оформление графиков
3.3. Отображение трехмерных графиков
3.4. Отображение растровых изображений
Глава 4. Программирование функций в MatLab
4.1. Порядок определения и вызова функций
4.2. Область видимости переменных
Глава 5. Работа с файлами в MatLab
5.1. Функции save и load
5.2. Функции fwrite и fread
5.3. Функции fscanf и fprintf
5.4. Функции imread и imwrite
Рассмотрим пример реализации функции для вычисления евклидового расстояния:
function
length = euqlid(x1, y1, x2, y2)
length = sqrt((x1-x2)^2+(y1-y2)^2);
Продемонстрируем возможность возвращения нескольких параметров на примере вычисления ширины и высоты прямоугольника, заданного координатами левого верхнего угла (x1,y1) и правого нижнего (x2,y2):
function
[width, height] = RectangleHW(x1,y1,x2,y2)
width = abs(x1-x2);
height = abs(y1-y2);
Данную функцию можно записать еще и с таким набором параметров:
function
[width, height] = RectangleHW(P1, P2)
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
где P1 и P2 – векторы (массивы) размером в 2 элемента и описывают точку в двумерном пространстве. В этом случае при вызове функции, значения координат точек можно передавать таким образом:
[W, H] = RectangleHW([0 0], [10 20]);
Если же программист сделает ошибку и при вызове функции передаст неверный размер вектора, например, так
[W, H] = RectangleHW(0, [10 20]);
то выполнение функции завершится с ошибкой и выполнение всего алгоритма остановится. Чтобы избежать этой ситуации MatLab позволяет проводить проверку корректности переданных аргументов и корректно завершать работу функции без остановки работы всего алгоритма. Следующий пример записи функции демонстрирует работу такой проверки:
function
[width, height] = RectangleHW(P1, P2)
if length(P1)
< 2 | length(P2) < 2
error( 'Bad
1st or 2nd parameter' );
end
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
При выполнении данной функции с неверными параметрами, функция выдаст сообщение об ошибке в командное окно MatLab, но программа продолжит свою работу.
Предложенная проверка осуществляет контроль за корректностью переданных аргументов. Однако важной является также проверка числа переданных входных аргументов и числа возвращаемых значений функцией. Например, если вместо двух аргументов, был передан только один, то функция ошибочно завершит свою работу. Аналогично, если функция ожидает возврата трех аргументов, в то время как она определена лишь для двух, то также возникнет ошибочная ситуация.
Для проверки числа переданных аргументов и числа ожидающих возвращаемых значений используются переменные nargin и nargout. Ниже приведен пример функции, использующей проверку корректности числа входных и выходных аргументов.
function
[width, height] = RectangleHW(P1, P2)
if nargin ~=
2
error( 'Bad
number of parameters' );
end
if nargout ~=
2
error( 'Must
be 2 return values' );
end
if length(P1)
< 2 | length(P2) < 2
error( 'Bad
1st or 2nd parameter' );
end
width = abs(P1(1)-P1(2));
height = abs(P2(1)-P2(2));
При этом проверки корректности параметров функции будут срабатывать в следующих ситуациях:
[W,
H] = RectangleHW([0 0]); % Bad number of parameters
[W, H, V] = RectangleHW([0
0], [10 20]); % Must be 2 return
[W, H] = RectangleHW(0,
[10 20]); % Bad 1st or 2nd parameter
Следует отметить, что переменные, объявленные внутри функций, имеют область видимости только в пределах функции, и за ее пределами уже не доступны (не видны). Следующий пример программы демонстрирует механизм области видимости имен переменных в MatLab:
function
MyFunc
x = 10;
disp(x);
MyFunc2();
function MyFunc2()
disp(x);
В результате на экране будет отображено
10
??? Undefined
function or variable 'x'.
Этот пример показывает, что переменная с именем x, объявленная в функции MyFunc, не доступна в функции MyFunc2. Это сделано с расчетом, чтобы переменные в разных функциях не влияли друг на друга даже если они имеют одни и те же имена. Однако в некоторых случаях требуется, чтобы переменная была видна за пределами функции, в которой объявлена. Это достигается путем обращения к переменной как к глобальной с помощью ключевого слова global, за которым следует имя глобальной переменной. Перепишем пример, представленный выше с использованием глобальной переменной:
function
MyFunc
x = 10;
disp(x);
MyFunc2();
function MyFunc2()
global x;
disp(x);
Обратите внимание, что ключевое слово global написано в функции MyFunc2 и говорит о том, что переменная x уже объявлена ранее и нужно ее использовать внутри текущей функции.
Создание программ часто предполагает сохранение результатов расчетов в файлы для их дальнейшего анализа, обработки, хранения и т.п. В связи с этим в MatLab реализованы различные функции по работе с файлами, содержащие данные в самых разных форматах. В этой главе рассмотрим наиболее полезные функции для сохранения и загрузки результатов работы алгоритмов из файлов.
В самом простом случае для сохранения и последующей загрузки каких-либо данных в MatLab предусмотрены две функции
save
<имя файла> <имена переменных> %
сохранение данных
load <имя
файла> <имена переменных> % загрузка
данных
Функция save позволяет сохранять произвольные переменные программы в файл, который будет (по умолчанию) располагаться в рабочем каталоге (обычно поддиректория work) и иметь расширение mat. Соответственно функция load позволяет загрузить из указанного mat-файла ранее сохраненные переменные. Ниже представлен пример использования данных функций:
function
save_load
x = ones(5);
y = 5;
s = 'hello';
save params x
y s;
x = zeros(5);
y = 0;
s = '';
load params x
y s;
disp(x);
disp(y);
disp(s);
В данной программе сначала
выполняется инициализация
Следует обратить внимание, что функция load позволяет загружать из mat-файла не все, а только указанные программистом переменные, например
load
params x; % загружает только значение переменной
x
load params y;
% загружает только значение переменной
y
load params x
s; % загружает значения переменных x и s
Недостатком рассмотренных функций save и load является то, что они работают с определенными форматами файлов (обычно mat-файлы) и не позволяют загружать или сохранять данные в других форматах. Между тем бывает необходимость загружать информацию, например, из бинарных файлов, созданных другими программными продуктами для дальнейшей обработки результатов в MatLab. С этой целью были разработаны функции
fwrite(<идентификатор файла>, <переменная>, <тип данных>);
и
<переменная>=fread(<
<переменная>=fread(<
<переменная>=fread(<
Здесь <идентификатор файла> - это указатель на файл, с которым предполагается работать. Чтобы получить идентификатор, используется функция
<идентификатор файла> = fopen(<имя файла>,<режим работы>);
где параметр <режим работы> может принимать значения, приведенные в табл. 5.1.
Таблица 5.1. Режимы работы с файлами в MatLab
параметр <режим работы> |
описание |
'r' |
чтение |
'w' |
запись (стирает предыдущее содержимое файла) |
'a' |
добавление (создает файл, если его нет) |
'r+' |
чтение и запись (не создает файл, если его нет) |
'w+' |
чтение и запись (очищает прежнее содержимое или создает файл, если его нет) |
'a+' |
чтение и добавление (создает файл, если его нет) |
'b' |
дополнительный параметр, означающий работу с бинарными файлами, например, ‘wb’, ‘rb’ ‘rb+’, ‘ab’ и т.п. |
Если функция fopen() по каким-либо причинам не может корректно открыть файл, то она возвращает значение -1. Ниже представлен фрагмент программы записи и считывания данных из бинарного файла:
A
= [1 2 3 4 5];
fid = fopen('my_file.dat',
'wb'); % открытие файла на запись
if fid == -1
% проверка корректности открытия
error('File
is not opened');
end
fwrite(fid, A,
'double'); % запись матрицы в файл (40 байт)
fclose(fid);
% закрытие файла
fid = fopen('my_file.dat',
'rb'); % открытие файла на чтение
if fid == -1
% проверка корректности открытия
error('File
is not opened');
end
B = fread(fid,
5, 'double'); % чтение 5 значений double
disp(B);
fclose(fid);
В результате работы данной программы в рабочем каталоге будет создан файл my_file.dat размером 40 байт, в котором будут содержаться 5 значений типа double, записанных в виде последовательности байт (по 8 байт на каждое значение). Функция fread() считывает последовательно сохраненные байты и автоматически преобразовывает их к типу double, т.е. каждые 8 байт интерпретируются как одно значение типа double.
В приведенном примере
явно указывалось число элементов (
feof(<идентификатор файла>)
которая возвращает 1 при достижении конца файла и 0 в других случаях. Перепишем программу для считывания произвольного числа элементов типа double из входного файла.
fid
= fopen('my_file.dat', 'rb'); % открытие файла на чтение
if fid == -1
error('File
is not opened');
end
B=0; % инициализация
переменной
cnt=1; % инициализация
счетчика
while ~feof(fid)
% цикл, пока не достигнут конец файла
[V,N] = fread(fid,
1, 'double'); %считывание одного
% значения
double (V содержит значение
% элемента,
N – число считанных элементов)
if N > 0
% если элемент был прочитан успешно, то
B(cnt)=V; %
формируем вектор-строку из значений V
cnt=cnt+1; %
увеличиваем счетчик на 1
end
end
disp(B); % отображение
результата на экран
fclose(fid);
% закрытие файла
В данной программе динамически формируется вектор-строка по мере считывания элементов из входного файла. MatLab автоматически увеличивает размерность векторов, если индекс следующего элемента на 1 больше максимального. Однако на такую процедуру тратится много машинного времени и программа начинает работать заметно медленнее, чем если бы размерность вектора B с самого начала была определена равным 5 элементам, например, так
B = zeros(5,1);
Следует также отметить, что функция fread() записана с двумя выходными параметрами V и N. Первый параметр содержит значение считанного элемента, а второй – число считанных элементов. В данном случае значение N будет равно 1 каждый раз при корректном считывании информации из файла, и 0 при считывании служебного символа EOF, означающий конец файла. Приведенная ниже проверка позволяет корректно сформировать вектор значений B.
С помощью функций fwrite() и fread() можно сохранять и строковые данные. Например, пусть дана строка
str = 'Hello MatLab';
которую требуется сохранить в файл. В этом случае функция fwrite() будет иметь следующую запись:
fwrite(fid, str, 'int16');
Здесь используется тип int16, т.к. при работе с русскими буквами система MatLab использует двухбайтовое представление каждого символа. Ниже представлена программа записи и чтения строковых данных, используя функции fwrite() и fread():
fid
= fopen('my_file.dat', 'wb');
if fid == -1
error('File
is not opened');
end
str='Привет
MatLab'; % строка для записи
fwrite(fid, str,
'int16'); % запись в файл
fclose(fid);
fid = fopen('my_file.dat',
'rb');
if fid == -1
error('File
is not opened');
end
B='';
cnt=1;
while ~feof(fid)
[V,N] = fread(fid,
1, 'int16=>char'); % чтение текущего
% символа
и преобразование
% его в тип
char
if N > 0
B(cnt)=V;
cnt=cnt+1;
end
end
disp(B); % отображение
строки на экране
fclose(fid);
Результат выполнения программы будет иметь вид
Привет MatLab
Описанные выше функции работы с файлами позволяют записывать и считывать информацию по байтам, которые затем требуется правильно интерпретировать для преобразования их в числа или строки. В то же время выходными результатами многих программ являются текстовые файлы, в которых явным образом записаны те или числа или текст. Например, при экспорте данных из MS Excel можно получить файл формата
174500,1.63820,1.63840,1.
180000,1.63740,1.63950,1.
181500,1.63830,1.63850,1.
183000,1.63720,1.64030,1.
где числа записаны в столбик и разделены запятой.
Прочитать такой файл побайтно, а затем интерпретировать полученные данные довольно трудоемкая задача, поэтому для этих целей были специально разработаны функции чтения
[value, count] = fscanf(fid, format, size)
и записи
count = fprintf(fid, format, a,b,...)
таких данных в файл. Здесь value – результат считывания данных из файла; count – число прочитанных (записанных) данных; fid – указатель на файл; format – формат чтения (записи) данных; size – максимальное число считываемых данных; a,b,.. – переменные для записи в файл.
Приведем пример чтения данных из файла, приведенного выше с помощью функции fscanf():
function
fscanf_ex
fid = fopen('my_excel.dat',
'r');
if fid == -1
error('File
is not opened');
end
S = fscanf(fid,
'%d,%f,%f,%f,%f,%d');
fclose(fid);
Здесь форматная строка состоит из спецификаторов
%d – работа с целочисленными
значениями;
%f – работа с вещественными значениями
Информация о работе Курс лекций по "Программированию и компьютерам"