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

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

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

N = length(a); % (N=4) число элементов массива а

Если требуется задать вектор-столбец, то это можно сделать так 

a = [1; 2; 3; 4];   % вектор-столбец

или так

b = [1 2 3 4]’;         % вектор-столбец

при этом доступ к элементам  векторов осуществляется также как  и для векторов-строк.

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

a = [1 2 3 4];      % начальный вектор a = [1 2 3 4]  
b = [a 5 6];        % второй вектор b = [1 2 3 4 5 6]

Здесь вектор b состоит  из шести элементов и создан на основе вектора а. Используя этот прием, можно осуществлять увеличение размера векторов в процессе работы программы:

a = [a 5];          % увеличение вектора а на один элемент

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

a1 = zeros(1, 100);     % вектор-строка, 100 элементов с  
% нулевыми значениями  
a2 = zeros(100, 1);     % вектор-столбец, 100 элементов с  
% нулевыми значениями  
a3 = ones(1, 1000);     % вектор-строка, 1000 элементов с  
% единичными значениями  
a4 = ones(1000, 1);     % вектор-столбец, 1000 элементов с  
% единичными значениями  
a5 = rand(1000, 1);     % вектор-столбец, 1000 элементов со  
% случайными значениями

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

E = [1 0 0; 0 1 0; 0 01];         % единичная матрица 3х3

или

E = [1 0 0  
    0 1 0  
     0 0 1];                 % единичная матрица 3х3

Аналогичным образом  можно задавать любые другие матрицы, а также использовать приведенные  выше функции zeros(), ones() и rand(), например:

A1 = zeros(10,10);      % нулевая матрица 10х10 элементов

или

A2 = zeros(10);              % нулевая матрица 10х10 элементов  
A3 = ones(5);           % матрица 5х5, состоящая из единиц  
A4 = rand(100);              % матрица 100х100, из случайных чисел

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

A = [1 2 3;4 5 6;7 8 9]; % матрица 3х3  
disp( A(2,1) );         % вывод на экран элемента, стоящего во  
                    % второй строке первого столбца, т.е. 4  
disp( A(1,2) );         % вывод на экран элемента, стоящего в  
                    % первой строке второго столбца, т.е. 2

Также возможны операции выделения указанной части матрицы, например:

B1 = A(:,1);   % B1 = [1; 4; 7] – выделение первого столбца  
B2 = A(2,:);   % B2 = [1 2 3] – выделение первой строки  
B3 = A(1:2,2:3);    % B3 = [2 3; 5 6] – выделение первых двух  
% строк и 2-го и 3-го столбцов матрицы А.

Размерность любой матрицы или  вектора в MatLab можно определить с  помощью функции size(), которая возвращает число строк и столбцов переменной, указанной в качестве аргумента:

a = 5;              % переменная а  
A = [1 2 3];        % вектор-строка  
B = [1 2 3; 4 5 6]; % матрица 2х3  
size(a)             % 1х1  
size(A)             % 1х3  
size(B)             % 2х3

1.6. Операции над матрицами и  векторами

В системе MatLab достаточно просто выполняются математические операции над матрицами и векторами. Рассмотрим сначала простые операции сложения и умножения матриц и векторов. Пусть даны два вектора

a = [1 2 3 4 5];        % вектор-строка  
b = [1; 1; 1; 1; 1];         % вектор-столбец

тогда умножение этих двух векторов можно записать так 

c = a*b;                % c=1+2+3+4+5=16  
d = b*a;                % d – матрица 5х5 элементов

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

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

a1 = [1 2 3 4 5];  
a2 = [5 4 3 2 1];  
c = a1+a2;               % c = [1+5, 2+4, 3+3, 4+2, 5+1];  
с = a2-a1;              % c = [5-1, 4-2, 3-3, 2-4, 1-5];

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

Аналогичным образом выполняются операции умножения и сложения между матрицами:

A = [1 2 3; 4 5 6; 7 8 9];  
B = ones(3);  
C = A+B;            % сложение двух матриц одинакового размера  
D = A+5;            % сложение матрицы и числа  
E = A*B;            % умножение матрицы А на В  
F = B*A;            % умножение матрицы В на А  
G = 5*A;            % умножение матрицы на число

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

a = [1 1 1];        % вектор-строка  
b = a’;             % вектор-столбец, образованный  
% транспонированием вектора-строки а.  
A = [1 2 3; 4 5 6; 7 8 9]; % матрица 3х3 элемента  
B = a*A;            % B = [12 15 18] – вектор-строка  
C = A*b;            % C = [6; 15; 24] – вектор-столбец  
D = a*A*a’;         % D = 45 – число, сумма эл-ов матрицы А  
E = A’;             % E – транспонированная матрица А  
F = inv(A);         % F – обратная матрица А  
G = A^-1;           % G – обратная матрица А

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

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

.* - поэлементное умножение;  
./ и .\ - поэлементные деления;  
.^ - поэлементное возведение в степень.

Рассмотрим работу данных операторов на следующем примере.

a = [1 2 3];        % вектор-строка  
b = [3 2 1];        % вектор-строка  
c = a.*b;           % c = [3 4 3]  
A = ones(3);        % матрица 3х3, состоящая из единиц  
B = [1 2 3;4 5 6; 7 8 9];         % матрица 3х3  
C = A.*B;           % матрица 3х3, состоящая из  
D = A./B;           % матрица 3х3, состоящая из  
E = A.\B;           % матрица 3х3, состоящая из  
F = A.^2;           % возведение элементов матрицы А в квадрат

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

Для поиска максимального  значения элемента вектора используется стандартная функция max(), которая  возвращает найденное максимальное значение элемента и его позицию (индекс):

a = [1 6 3 4];  
[v, i] = max(a);             % v = 6, i = 2;

или

v = max(a);                  % v = 6;

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

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

A = [4 3 5; 6 7 2; 3 1 8];  
[V, I] = max(A);             % V=[6 7 8], I = [2 2 3]  
V = max(A);                  % V=[6 7 8]

Полный синтаксис функции max() можно  узнать, набрав в командном окне MatLab команду 

help <название функции>

Аналогичным образом работает функция min(), которая определяет минимальное значение элемента вектора или матрицы и его индекс.

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

a = [3 5 4 2 1];  
s = sum(a);                   % s = 3+5+4+2+1=15  
A = [4 3 5; 6 7 2; 3 1 8];  
S1 = sum(A);                  % S1=[13 11 15]  
S2 = sum(sum(A));            % S2=39

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

Для сортировки значений элементов  вектора или матрицы по возрастанию  или убыванию используется функция sort() следующим образом:

a = [3 5 4 2 1];

b1 = sort(a);                % b1=[1 2 3 4 5]  
b2 = sort(a, ‘descend’);      % b2=[5 4 3 2 1]  
b3 = sort(a, ‘ascend’);      % b3=[1 2 3 4 5]

для матриц

A = [4 3 5; 6 7 2; 3 1 8];  
B1 = sort(A);                % B1=[3 1 2  
                            %     4 3 5  
                             %     6 7 8]  
B2 = sort(A, ‘descend’);     % B2=[6 7 8  
                             %     4 3 5  
                             %     3 1 2]

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

a = [3 5 4 2 1];  
b1 = find(a == 2);           % b1 = 4 – индекс элемента 2  
b2 = find(a ~= 2);           % b2 = [1 2 3 5] – индексы без 2  
b3 = find(a > 3);            % b3 = [2 3]

В приведенном примере символ ‘= =’ означает проверку на равенство, а символ ‘~=’ выполняет проверку на неравенство значений элементов вектора а. Более подробно об этих операторах будет описано в разделе условные операторы.

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

a = [3 5 4 2 1];  
m = mean(a);                 % m = 3  
A = [4 3 5; 6 7 2; 3 1 8];  
M1 = mean(A);                % M1 = [4.333 3.667 5.000]  
M2 = mean(mean(A));          % M2 = 4.333

1.7. Структуры в MatLab

При разработке программ важным является выбор эффективного способа представления данных. Во многих случаях недостаточно объявить простую переменную или массив, а нужна более гибкая форма представления данных. Таким элементом может быть структура, которая позволяет включать в себя разные типы данных и даже другие структуры. Структуры задаются следующим образом:

S = struct('field1',VALUES1,'field2',VALUES2,...);

где field1 – название первого  поля структуры; VALUES1 – переменная первого  поля структуры, и т.д.

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

S = struct('title','','author','','year',0);

В итоге задается структура  с тремя полями: title, author и year. Каждое поле имеет свой тип данных и значение.

Для того, чтобы записать в эту структуру конкретные значения используется оператор ‘.’ (точка) для  доступа к тому или иному полю структуры:

S.title = 'Евгений Онегин';  
S.author = 'Пушкин';  
S.year = 2000;

и таким образом, переменная S хранит информацию о выбранной книге.

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

lib(100,1) = struct('title','','author','','year',0);

и записывать информацию о книгах так:

lib(1).title = 'Евгений Онегин';  
lib(1).author = 'Пушкин';  
lib(1).year = 2000;

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

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

isstruct( S ) – возвращает истину, если аргумент структура  
isfield( S, 'name') – возвращает истину, если имеется такое поле  
fieldnames( S ) – возвращает массив строк с именами всех полей

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

 

 

название

автор

год издания 

lib[1]

lib[1].title

lib[1].author

lib[1].year

 

 

 

 

 

 

 

 

lib[2]

lib[2].title

lib[2].author

lib[2].year

 

 

 

 

 

 

 

 

lib[3]

lib[3].title

lib[3].author

lib[3].year

 

 

 

 

 

 

lib[100]

lib[100].title

lib[100].author

lib[100].year


Рис. 1.1. Графическое  представление массива структур хранения информации по 100 книгам

1.8. Ячейки в MatLab

Ячейки также как  и структуры могут содержать  разные типы данных, объединенные одной  переменной, но в отличии от вектора  структур, вектор ячеек может менять тип данных в каждом элементе. Таким  образом, вектор ячеек является универсальным  контейнером – его элементы могут содержать любые типы и структуры данных, с которыми работает MatLab – векторы чисел любой размерности, строки, векторы структур и другие (вложенные) векторы ячеек.

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