Курс лекций по "Программированию и компьютерам"

Автор работы: Пользователь скрыл имя, 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

Вложенные файлы: 1 файл

Основы программирования в MatLab.doc

— 562.50 Кб (Скачать файл)

Рассмотрим пример реализации функции для вычисления евклидового  расстояния:

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  
                                         % values  
[W, H] = RectangleHW(0, [10 20]); % Bad 1st or 2nd parameter

4.2. Область видимости переменных

Следует отметить, что  переменные, объявленные внутри функций, имеют область видимости только в пределах функции, и за ее пределами  уже не доступны (не видны). Следующий  пример программы демонстрирует  механизм области видимости имен переменных в 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 уже объявлена ранее и нужно  ее использовать внутри текущей функции.

Глава 5. Работа с файлами в MatLab

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

5.1. Функции save и load

В самом простом случае для сохранения и последующей  загрузки каких-либо данных в 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);

В данной программе сначала  выполняется инициализация переменных x, y, s, затем, они сохраняются в  файл params.mat, заменяются другими значениями и после загрузки отображаются на экране. При выполнении этой программы на экране будут показаны те же значения переменных, которые они принимали в самом начале. Таким образом демонстрируется работа функций save и load.

Следует обратить внимание, что функция load позволяет загружать из mat-файла не все, а только указанные программистом переменные, например

load params x;      % загружает только значение переменной x  
load params y;      % загружает только значение переменной y  
load params x s;    % загружает значения переменных x и s

5.2. Функции fwrite и fread

Недостатком рассмотренных  функций 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.

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

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

5.3. Функции fscanf и fprintf

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

174500,1.63820,1.63840,1.63660,1.63750,288  
180000,1.63740,1.63950,1.63660,1.63820,361  
181500,1.63830,1.63850,1.63680,1.63740,223  
183000,1.63720,1.64030,1.63720,1.64020,220

где числа записаны в  столбик и разделены запятой.

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

[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 – работа с вещественными значениями

Информация о работе Курс лекций по "Программированию и компьютерам"