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

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

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

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

исключая элемент с индексом 5. Такую программу можно записать следующим образом:

function sum_array  
S = 0;                  % начальное значение суммы  
a = [1 2 3 4 5 6 7 8 9]; % массив  
i=0;                     % счетчик индексов массива  
while i < length(a)     % цикл (работает пока i меньше  
                        % длины массива а)  
     i=i+1;             % увеличивается счетчик индексов на 1  
    if i == 5               % если индекс равен 5  
         continue;      % то его не подсчитываем  
     end  
     S=S+a(i);          % подсчитывается сумма элементов  
end                     % конец цикла  
disp(S);                % отображение суммы 40 на экране

Следует отметить, что в данной программе увеличение индекса массива i происходит до проверки условия. Это сделано для того, чтобы значение индекса увеличивалось на 1 на каждой итерации работы цикла. Если  увеличение счетчика i записать как в предыдущих примерах, т.е. после подсчета суммы, то из-за оператора continue его значение остановилось бы на 5 и цикл while работал бы «вечно».

2.4. Оператор цикла for

Часто при организации  цикла требуется перебирать значение счетчика в заданном диапазоне значений и с заданным шагом изменения. Например, чтобы перебрать элементы вектора (массива), нужно организовать счетчик от 1 до N с шагом 1, где N – число элементов вектора. Чтобы вычислить сумму ряда, также задается счетчик от a до b с требуемым шагом изменения step. И так далее. В связи с тем, что подобные задачи часто встречаются в практике программирования, для их реализации был предложен свой оператор цикла for, который позволяет проще и нагляднее реализовывать цикл со счетчиком.

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

for <счетчик> = <начальное значение>:<шаг>:<конечное значение>  
      <операторы цикла>  
end

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

function search_max  
a = [3 6 5 3 6 9 5 3 1 0];  
m = a(1);                    % текущее максимальное значение  
for i=1:length(a)            % цикл от 1 до конца вектора с  
                             % шагом 1 (по умолчанию)  
    if m < a(i)                   % если a(i) > m,  
         m = a(i);           % то m = a(i)  
    end  
end                          % конец цикла for  
disp(m);

В данном примере цикл for задает счетчик i и меняет его значение от 1 до 10 с шагом 1. Обратите внимание, что если величина шага не указывается  явно, то он берется по умолчанию  равным 1.

В следующем примере  рассмотрим реализацию алгоритма смещения элементов вектора вправо, т.е. предпоследний элемент ставится на место последнего, следующий  – на место предпоследнего, и т.д. до первого элемента:

function queue  
a = [3 6 5 3 6 9 5 3 1 0];  
disp(a);  
for i=length(a):-1:2              % цикл от 10 до 2 с шагом -1  
     a(i)=a(i-1);            % смещаем элементы вектора а  
end                          % конец цикла for  
disp(a);

Результат работы программы 

3 6 5 3 6 9 5 3 1 0  
3 3 6 5 3 6 9 5 3 1

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

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

,

где  - коэффициент от -1 до 1;  - нормальная случайная величина с нулевым математическим ожиданием и дисперсией

,

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

function modeling_x  
r = 0.95;                    % коэффициент модели  
N = 100;                     % число моделируемых точек  
ex = 100;                    % дисперсия процесса  
et = ex*(1-r^2);             % дисперсия случайной добавки  
x = zeros(N,1);                   % инициализация вектора х  
x(1) = sqrt(ex)*randn;       % моделирование 1-го отсчета  
for i=2:N                    % цикл от 2 до N  
     x(i)=r*x(i-1)+sqrt(et)*randn;          % моделирование СП  
end                          % конец цикла  
plot(x);                     % отображение СП в виде графика

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

Рис. 2.1. Результат моделирования случайной последовательности.

Работа программы начинается с определения переменных ,  (в программе переменная ex) и  для реализации указанной модели. Затем вычисляется дисперсия  и моделируется первый отсчет случайного процесса с помощью функции randn. Функция randn выполняет генерацию нормальных случайных величин с нулевым средним и единичной дисперсией. Чтобы сгенерировать случайную величину с дисперсией  достаточно случайную величину с единичной дисперсией умножить на , т.к. дисперсия – это средний квадрат случайной величины относительно математического ожидания. В результате имеем программную строчку

x(1) = sqrt(ex)*randn;

Затем, реализуется цикл for со счетчиком i от 2 до N с шагом 1. Внутри цикла выполняется моделирование  оставшихся N-1 отсчетов случайного процесса в соответствии с приведенной  выше формулой. В последней строчке  программы записана функция plot(), которая выводит смоделированную последовательность на экран в виде графика. Более подробно работа с выводом графиков на экран будет рассмотрена в следующей главе.

Глава 3. Работа с графиками в MatLab

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

3.1. Функция plot

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

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

x = 0:0.01:pi;

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

y = sin(x);

и выведем результат  на экран 

plot(x,y);

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

Представленная запись функции plot() показывает, что сначала  записывается аргумент со множеством точек оси Ох, а затем, аргумент со множеством точек оси Oy. Зная эти  значения, функция plot() имеет возможность  построить точки на плоскости и линейно их интерполировать для придания непрерывного вида графика.

Рис. 3.1. Отображение функции синуса с помощью функции plot().

Функцию plot() можно записать и с одним аргументом x или y:

plot(x);  
plot(y);

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

Анализ рис. 3.2 показывает, что в случае одного аргумента функция plot() отображает множество точек по оси Oy, а по оси Оx происходит автоматическая генерация множества точек с единичным шагом. Следовательно, для простой визуализации вектора в виде двумерного графика достаточно воспользоваться функцией plot() с одним аргументом.

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

x = 0:0.01:pi;  
y1 = sin(x);  
y2 = cos(x);  
plot(x,y1,x,y2);

Результат работы данного  фрагмента программы представлен на рис. 3.3.

а)                                                                   б)

Рис. 3.2. Результаты работы функции plot() с одним аргументом:

а – plot(x); б – plot(y).

Рис. 3.3. Отображение двух графиков в одних координатных осях.

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

y1 = sin(x);  
y2 = cos(x);

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

в которой столбцы  составлены из векторов y1 и y2 соответственно. Такая матрица будет отображена функцией

plot([y1’ y2’]);    % апострофы переводят вектор-строку  
% в вектор-столбец

в виде двух графиков (рис. 3.4).

Рис. 3.4. Отображение двумерной  матрицы в виде двух графиков.

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

x1 = 0:0.01:2*pi;  
y1 = sin(x1);  
 
x2 = 0:0.01:pi;  
y2 = cos(x2);  
 
plot(x1, y1);           % рисование первого графика  
figure;                 % создание 2-го графического окна  
plot(x2, y2);           % рисование 2-го графика во 2-м окне

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

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

x1 = 0:0.01:2*pi;  
y1 = sin(x1);  
   
x2 = 0:0.01:pi;  
y2 = cos(x2);  
   
figure(1);          %создание окна с номером 1  
plot(x1, y1);       % рисование первого графика  
figure(2);          % создание графического окна с номером 2  
plot(x2, y2);       % рисование 2-го графика во 2-м окне

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

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

subplot(<число строк>, <число столбцов>, <номер координатной оси>)

Рассмотрим пример отображения  двух графиков друг под другом вышеприведенных  функций синуса и косинуса.

x1 = 0:0.01:2*pi;  
y1 = sin(x1);  
   
x2 = 0:0.01:pi;  
y2 = cos(x2);  
   
figure(1);  
subplot(2,1,1);         % делим окно на 2 строки и один столбец  
plot(x1,y1);        % отображение первого графика  
subplot(2,1,2);         % строим 2-ю координатную ось  
plot(x2,y2);        % отображаем 2-й график в новых осях

Результат работы программы  показан на рис. 3.5.

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

subplot(‘position’, [left bottom width height]);

где left – смещение от левой стороны окна; bottom – смещение от нижней стороны окна; width, height –  ширина и высота графика в окне. Все эти переменные изменяются в пределах от 0 до 1.

Рис. 3.5. Пример работы функции subplot.

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

x1 = 0:0.01:2*pi;  
y1 = sin(x1);  
   
subplot(‘position’, [0.33 0.33 0.33 0.33]);  
plot(x1,y1);

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

Таким образом, используя  параметр position можно произвольно размещать графические элементы в плоскости окна.

Рис. 3.6. Пример работы функции subplot с параметром position.

3.2. Оформление графиков

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

Функция plot() позволяет  менять цвет и тип отображаемой линии. Для этого, используются дополнительные параметры, которые записываются следующим  образом:

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