Рефераты
 

Система математических расчетов MATLAB

p align="left"> A{1,2}(1,1) = {[5 2 8; 7 3 0; 6 7 3]};

A{1,2}(1,2) = {'Test 1'};

A{1,2}(2,1) = {[2-4i 5+7i]};

A{1,2}(2,2) = {cell(1,2)}

A{1,2}{2,2}(1) = {17};

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

Вы также можете конструировать вложенные массивы ячеек непосредственно с использова-нием операторов присваивания, как это показано в шаге 3 выше.

Индексация вложенных массивов ячеек

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

· Для доступа к массиву 5х5 ячейке (1,1) используйте A{1,1}.

· Для доступа к массиву 3х3 в позиции (1,1) ячейки (1,2) используйте A{1,2}{1,1}.

· Для доступа к ячейке 2х2 в ячейке (1,2) используйте A{1,2}.

· Для доступа к пустой ячейке в позиции (2,2) ячейки (1,2) запишем A{1,2}{2,2}{1,2}.

Преобразования между массивами ячеек и числовыми массивами

Для перехода от формата массива ячеек к числовому массиву следует воспользоваться прог-раммой, включающей цикл. Например, создадим массив ячеек F:

F{1,1} = [1 2; 3 4];

F{1,2} = [-1 0; 0 1];

F{2,1} = [7 8; 4 1];

F{2,2} = [4i 3+2i; 1 - 8i 5];

Используем теперь три вложенных цикла для копирования содержимого массива F в число-вой массив NUM.

for k = 1:4

for i = 1:2

for j = 1:2

NUM(i,j,k) = F{k}(i,j);

end

end

end

Аналогично, вы должны использовать петли for для присваивания каждого значения число-вого массива одной ячейке массива ячеек:

G = cell(1,16);

for m = 1:16

G{m} = NUM(m);

end

Массивы ячеек, содержащие структуры

Для хранения групп структур с различной архитектурой полей можно использовать массивы ячеек

c_str = cell(1,2);

c_str{1}.label = '12/2/94 - 12/5/94';

c_str{1}.obs = [47 52 55 48; 17 22 35 11];

c_str{2}.xdata = [-0.03 0.41 1.98 2.12 17.11];

c_str{2}.ydata = [-3 5 18 0 9];

c_str{2}.zdata = [0.6 0.8 1 2.2 3.4];

Ячейка l массива c_str содержит структуру с двумя полями, где в одном поле хранится стро-ка символов, а во втором - вектор. Ячейка 2 содержит структуру с тремя полями векторов.

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

cell_array{index}.field

Например, чтобы получить содержимое поля label структуры в ячейке 1 нужно записать

c_str{1}.label

Многомерные массивы ячеек

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

Например, создадим простой трехмерный массив ячеек С из двух массивов А и В:

A{1,1} = [1 2; 4 5];

A{1,2} = 'Name';

A{2,1} = 2 - 4i;

A{2,2} = 7;

B{1,1} = 'Name2';

B{1,2} = 3;

B{2,1} = 0:1:3;

B{2,2} = [4 5]';

C = cat(3,A,B);

Общая структура индексации массива ячеек С имеет вид

Многомерные массивы структур

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

patient(1,1,1).name = 'John Doe';

patient(1,1,1).billing = 127.00;

patient(1,1,1).test = [79 75 73; 180 178 177.5; 220 210 205];

patient(1,2,1).name = 'Ann Lane';

patient(1,2,1).billing = 28.50;

patient(1,2,1).test = [68 70 68; 118 118 119; 172 170 169];

patient(1,1,2).name = 'Al Smith';

patient(1,1,2).billing = 504.70;

patient(1,1,2).test = [80 80 80; 153 153 154; 181 190 182];

patient(1,2,2).name = 'Dora Jones';

patient(1,2,2).billing = 1173.90;

patient(1,2,2).test = [73 73 75; 103 103 102; 201 198 200];

Геометрически данную структуру можно отобразить следующим образом

Применение функций к многомерным массивам структур

Для применения функций к многомерным массивам структур. нужно использовать индекси-рование полей. Например, найдем сумму столбцов структуры test в patient(1,1,2):

sum((patient(1,1,2).test));

Аналогично, просуммируем все поля billing в многомерном массиве patient:

total = sum([patient.billing]);

ПРОГРАММИРОВАНИЕ НА MATLAB

Программирование на языке MATLAB : Быстрый старт

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

В простейшем случае процесс выглядит так:

1. Вы создаете М-файл используя текстовой редактор.

2. Вызываете М-файл из командной строки или же из другого М-файла.

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

Типы М-файлов

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

М-сценарии

М-функции

· Не допускают входных и выходных переменных

· Допускают входные и выходные аргументы

· Оперируют в данными из рабочей области

· Внутренние переменные по умолчанию являются локальными по отношению к функциям

· Предназначены для автоматизации последовательности шагов, которые нужно выполнять много раз

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

Что такое М-файл ?

В данном разделе мы рассмотрим основные части, из которых состоит М-функция. Допус-тим, мы имеем следующую функцию fact, вычисляющую факториал целого числа:

function f = fact (n) % Строка определения функции

% FACT Factorial. % Первая строка помощи (H1 line)

% FACT(N) returns the factorial of N, H! % Текст помощи (Help text)

% usually denoted by N!

% Put simply, FACT(N) is PROD(1:N).

f = prod(1:n); % Тело функции

Эта функция имеет некоторые элементы, которые являются общими для всех функций систе-мы MATLAB:

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

* Строка H1 (H1 line). H1 обозначает «первую строку» помощи. MATLAB выводит эту стро-ку в командное окно, когда вы пользуетесь функцией lookfor или запрашиваете помощь по всей директории.

* Текст помощи (Help text). MATLAB выводит в командное окно данный текст вместе со строкой H1, когда вы запрашиваете помощь по конкретной функции, то есть вводите help Имя_Функции.

* Тело функции. Эта часть функции содержит коды (команды), которые выполняют вычисле-ния и определяют значения всех выходных переменных.

Обеспечение помощи для вашей программы

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

help Имя_Функции

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

help Имя_Директории

Если данная директория не содержит файл Contents.m, то при вводе help Имя_Директории в командное окно выводится первая строка помощи (H1 line) для каждого файла директории.

Создание М-файлов: Использование текстовых редакторов

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

Внимание! Для вызова редактора нужно в меню File выбрать New и затем M-File.

Другой способ вызова редактира М-файла из командной строки состоит в использовании фу-нкции edit. For example, при вводе

edit foo

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

После того как вы создали этот файл, его можно найти в списке файлов вашей текущей директории, для чего надо ввести команду

what

Можно также распечатать в командном окне файл командой

type fact

Наконец, вы можете вычислить факториал любого целого числа, например, 5-и

fact(5)

ans =

120

Внимание! Сохраняйте все созданные или измененные вами М-файлы в директории (ката-логе), который не находится в дереве каталогов MATLAB-а. Если вы сохраните ваши М-файлы в дереве каталогов MATLAB-а, они могут быть уничтожены при установке новой версии MATLAB-а.

Сценарии

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

Простой пример сценария

Приведенные ниже выражения вычисляют функцию rho для нескольких тригонометричес-ких функций угла theta, и строят серию графиков в полярной системе координат

% An M-file script to produce % Линия комментариев

% "flower petal" plots

theta = -pi:0.01:pi; % Вычисления

rho(1,:) = 2*sin(5*theta).^2;

rho(2,:) = cos(10*theta).^3;

rho(3,:) = sin(theta).^2;

rho(4,:) = 5*cos(3.5*theta).^3;

for i = 1:4

polar(theta,rho(i,:)) % Вывод на графики

pause

end

Попробуйте ввести эти команды в М-файл, названный petals.m. Этот файл является теперь сценарием MATLAB-а. Ввод команды petals (лепестки) в командной строке MATLAB -а приводит к выполнению команд сценария. Команда pause приостанавливает выполнение цикла до нажатия какой-либо клавиши (например, Return). Таким образом, после того как сценарий отображает один график из четырех, нажатие клавиши Return приводит к появле-нию следующего. Здесь мы не имеем входных или выходных переменных; сценарий petals создает требуемые ему переменные в основном рабочем пространстве MATLAB-а. Когда вы-полнение сценария завершено, все созданные переменные (i, theta, и rho) остаются в рабо-чем пространстве. Вы можете убедиться в этом, вводя команду whos в командной строке.

Функции

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

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

Функция average является простым М-файлом, который вычисляет среднее значение элемен-тов вектора.

function y = average(x)

% AVERAGE Mean of vector elements.

% AVERAGE(X), where X is a vector, is the mean of vector elements.

% Non-vector input results in an error.

[m,n] = size(x);

if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))

error('Input must be a vector')

end

y = sum(x) / length(x) ; % Фактические вычисления

При вводе не векторной величины, данная функция выдает сообщение об ошибке (более точ-но, на дисплей выводится фраза «Вход должен быть вектором»). Вы можете ввести эти ко-манды в М-файл, названный average.m. Функция average допускает единственный вход и возвращает единственный выходной аргумент. Для обращения к данной функции, введите

z = 1:99;

average(z)

что даст следующий результат

ans =

50

Основные части синтаксиса М-функций

Функции в общем случае состоят из следующий частей:

· Строка определения функции (The Function Definition Line)

· Строка помощи H1 (The H1 Line)

· Текст помощи (Help Text)

· Тело функции (The Function Body)

· Комментарии (Comments)

Строка определения функции

Строка определения функции информирует систему MATLAB , что М-файл содержит функ-цию, и задает последовательность входных и выходных переменных. Для функции average эта строк имеет следующий вид:

где input argument - входной аргумент;

function name - имя функции;

output argument - выходной аргумент;

keyword - зарезервированное слово;

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

function [x,y,z] = sphere(theta, phi, rho)

Если функция не имеет выходных переменных, оставьте выход пустым, например,

function printresults(x)

или используйте пустые квадратные скобки

function [ ] = printresults(x)

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

Строка помощи H1

Строка H1, названная так потому что она является первой строкой текста помощи (Help text), является линией комментария, которая следует непосредственно за строкой определения фу-нкции. Поскольку она состоит из текста комментария, строка H1начинается с символа про-цента (%). Для функции average эта строка имеет вид

% AVERAGE Mean of vector elements.

(СРЕДНЕЕ ЗНАЧЕНИЕ Вычисление среднего значения векторов)

Эта строка является первой строкой текста, который появляется при вводе пользователем в командной строке команды

help function_name

(help имя_функции)

Далее, функция lookfor производит поиск и выводит в командное окно тольку строку H1. Так как данная строка обеспечивает важную обобщающую информацию о М-файле, очень важно сделать ее по возможности более описательной.

Текст помощи

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

% AVERAGE(X), where X is a vector, is the mean of vector elements.

% Nonvector input results in an error.

(% СРЕДНЕЕ(Х), где Х является вектором, вычисляет среднее значение

%элементов вектора. Не векторный вход приводит к ошибке).

Когда вы вводите help function_name, MATLAB выводит линии комментариев, которые на-ходятся между строкой определения функции и первой строкой не комментариев (выполня-емой или пустой строкой). MATLAB игнорирует любые линии комментариев, которые появ-ляются за данным блоком текста помощи. Например, напечатав help sin получим

SIN Sine.

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

(SIN(X) является синусом элементов массива Х)

Тело функции

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

ции average содержит нескольких простых программных выражений:

[m,n] = size(x);

if (~((m == 1) | (n == 1)) | (m == 1 & n == 1)) % Flow control

error('Input must be a vector') % Error message display

end

y = sum(x)/length(x); % Computation and assignment

Комментарии

Как было указано ранее, строки комментариев начинаются с символа процента (%). Строки комментариев могут быть в любом месте М-файла, а также вы можете добавить коммента-рии к концу строки кодов программы. Например,

% Add up all the vector elements.

y = sum(x) % Use the sum function.

( % Суммирование всех элементов вектора.

y = sum(x) % Используйте функцию sum)

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

Имена функций

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

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

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

Как работает функция

Вы можете вызвать М-функцию как из командной строки MATLAB-а, так и из другого М-файла. Убедитесь, что вы включили все необходимые аргументы, заключив входные аргу-менты в обычные скобки, а выходные - в квадратные.

Определение имени функции

Когда MATLAB сталкивается с новым именем, он осуществляет следующую последователь-ность шагов:

1. Проверяет, не является ли имя переменной.

2. Проверяет, не является ли имя подпрограммой (subfunction), то есть функцией MATLAB-а, которая находится в пределах того же М-файла, что и вызываемая функ-ция.

3. Проверяет, не является ли имя частной функцией (private function), то есть функцией, которая находится в специальной директории под названием Private (private directo-ry) , то есть директории доступной только для М-файлов в пределах той же директо-рии где она сама находится.

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

Что происходит при вызове функцию

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

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

Синтаксис

Описание

clear function_name

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

clear functions

Удаляет все скомпилированные М-функции

clear all

Удаляет все переменные и функции

Создание P-кодов файлов

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

pcode average

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

Как MATLAB передает аргументы функции

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

Рабочие пространства функций

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

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

Проверка числа аргументов функции

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

function c = testarg1(a,b)

if (nargin == 1)

c = a.^2;

elseif (nargin == 2)

c = a + b;

end

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

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

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

function testvar (varargin)

for i = 1:length (varargin)

x(i) = varargin{i}(1);

y(i) = varargin{i}(2);

end

xmin = min(0,min(x));

ymin = min(0,min(y));

axis([xmin fix(max(x)) + 3 ymin fix(max(y)) + 3])

plot(x,y)

Функция testvar рабоает с различным числом входных переменных; например, вы можете ввести два различных набора данных

testvar ([2 3], [1 5], [4 8], [6 5], [4 2], [2 3])

testvar ([-1 0], [3 -5], [4 2], [1 1])

Распаковка содержимого функции varargin

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

y(i) = varargin{i} (2);

Индексация ячеек имеет два набора компонент - первый набор указывает ячейку и заключен в фигурные скобки, а второй набор относится к содержимому ячейки и заключен в обычные скобки. В приведенном выше операторе выражение {i} обозначает обращение к i-ой ячейке в varargin, а выражение (2) представляет второй элемент содержимого выбранной ячейки.

Упаковка выходных переменных в функцию varargout

Когда вы хотите использовать произвольное число выходных аргументов, вы должны преду-смотреть процедуру упаковки выходных переменных в массив ячеек varargout. При этом, для определения конкретного числа вызываемых выходных аргументов используйте функ-цию nargout. Например, приведенный ниже пример принимает входной массив в виде двух столбцов, где первый столбец характеризует набор данных по оси x, а второй столбец - соот-ветствующий набор данных по оси y . Данные наборы разбиваются на отдельные пары век-торов [xi yi], которые вы можете передать описанной выше функции testvar.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10


© 2010 BANKS OF РЕФЕРАТ