АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Программирование М-функций

Прочитайте:
  1. Линейное программирование
  2. Нейролингвистическое программирование


#$+Понятия функции и сценария.

Работая в интерактивном режиме, приходится всё время вводить нужные команды с клавиатуры. Затем, в следующих сеансах работы с системой MATLAB, можно командой load ввести из MAT-файла ранее сохранённую информацию о переменных, с которыми ранее осуществлялись вычисления. Однако команды для её обработки потребуется заново вводить с клавиатуры.

Это вполне приемлемо, когда заранее неизвестен порядок обработки информации, или когда объём такой обработки невелик и повторяется редко. Если же порядок обработки информации заранее известен и её надо осуществлять многократно, то лучше последовательность команд оформить в виде сценария.

Сценарий - это текстовый файл, в котором в нужном порядке записаны команды, подлежащие последовательному выполнению. Создать такой файл можно с помощью любого текстового редактора, но система MATLAB располагает собственным текстовым редактором для этих целей, который к тому же обеспечивает дополнительные удобства. В результате лучше всего пользоваться именно этим редактором. Он вызывается командой меню File | New | M-file и работает в своём собственном окне:

Сценарий производит вычисления как с переменными, которые определяются

 

непосредственно внутри него, так и с переменными, ранее определёнными в рабочем пространстве системы MATLAB. Таким образом, пространство переменных у них общее.

После создания сценария его надо сохранить в файле на диске. Этот файл может иметь произвольное имя ( желательно, чтобы оно не совпало с именами файлов, входящих в стандартную поставку системы MATLAB ), но расширение имени должно состоять из одной буквы m ( например, myScript1.m и тому подобное ). По этой причине принято говорить, что сценарии хранятся в M-файлах. Их не надо путать с MAT-файлами, изученными ранее и в которых хранятся переменные из рабочего пространства системы MATLAB.

Каталог на диске для хранения M-файлов может быть любым, но путь к этому каталогу обязательно должен быть известен MATLABу. MATLAB хранит сведения обо всех таких каталогах. Для нового каталога надо выполнить команду меню ( командного окна ) File | Set Path…, с помощью которого вызывается диалоговое окно с именем Path Browser (Просмотрщик путей доступа к файлам):

 

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

Path | Add to path..

После того, как мы добавили новый каталог, в нём можно сохранить файл с созданным в редакторе сценарием. Сохранёный таким образом сценарий в любой момент можно выполнить целиком ( то есть выполнить за один раз все команды, входящие в этот сценарий ), если набрать в командном окне имя файла ( без расширения ), содержащего сценарий, и нажать клавишу Enter.

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

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

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

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

Сейчас мы подробно рассмотрим все особенности устройства M-функций.


#$+Синтаксис определения и вызова M-функций.

Текст M-функции должен начинаться с заголовка, после которого следует тело функции.

Заголовок определяет " интерфейс" функции ( способ взаимодействия с ней ) и устроен следующим образом:

function [ RetVal1, RetVal2,… ] = FunctionName( par1, par2,… )

Здесь провозглашается функция ( с помощью неизменного "ключевого" слова function ) с именем FunctionName, которая принимает входные параметры par1, par2,…, и вырабатывает ( вычисляет ) выходные ( возвращаемые ) значения RetVal1, RetVal2…

По-другому говорят, что аргументами функции являются переменные par1, par2,.., а значениями функции ( их надо вычислить ) являются переменные RetVal1, RetVal2,… .

Указанное в заголовке имя функции (в приведённом примере - FunctionName) должно служить именем файла, в который будет записан текст функции. Для данного примера это будет файл FunctionName.m ( расширение имени, по-прежнему, должно состоять лишь из одной буквы m ). Рассогласования имени функции и имени файла не допускается!

Тело функции состоит из команд, с помощью которых вычисляются возвращаемые значения. Тело функции следует за заголовком функции. Заголовок функции плюс тело функции в совокупности составляют определение функции.

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

function [ A, B ] = MatrProc1( X1, X2, x )

A = X1 .* X2 * x;

B = X1 .* X2 + x;

рассчитана на "приём" двух массивов одинаковых ( но произвольных ) размеров и одного скаляра.

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

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

Если фактический параметр задан именем некоторой переменной, то реальные вычисления будут производиться с копией этой переменной ( а не с ней самой ). Это называется передачей параметров по значению.

Ниже показан вызов из командного окна MATLABа ранее созданной нами для примера функции MatrProc1.

 

Здесь имена фактических входных параметров ( W1 и W2 ) и переменных, в которых записываются результаты вычислений ( Res1 и Res2 ), не совпадают с именами аналогичных переменных в определении функции MatrProc1. Очевидно, что совпадения и не требуется, тем более, что у третьего входного фактического параметра нет имени вообще! Чтобы подчеркнуть это возможное отличие, имена входных параметров и выходных значений в определении функции называют формальными.

В рассмотренном примере вызова функции MatrProc1 из двух входных квадратных матриц 2 x 2 получаются две выходные матрицы Res1 и Res2 точно таких же размеров:

Res1 =
9 6
6 6

Res2 =
6 5
5 5

Вызвав функцию

MatrProc1 [r1,r2] = MatrProc1( [ 1 2 3; 4 5 6 ], [ 7 7 7; 2 2 2 ], 1 );

с двумя входными массивами размера 2x3, получим две выходные матрицы размера 2x3. То есть, одна и та же функция MatrProc1 может обрабатывать входные параметры различных размеров и размерностей! Можно вместо массивов применить эту функцию к скалярам ( это всё равно массивы размера 1x1 ).

Теперь рассмотрим вопрос о том, можно ли использовать эту функцию в составе выражений так, как это делается с функциями, возвращающими единственное значение? Оказывается это делать можно, причём в качестве значения функции, применяемого для дальнейших вычислений, используется первое из возвращаемых функцией значений. Следующее окно системы MATLAB иллюстрирует это положение:

 

При вызове с параметрами 1,2,1 функция MatrProc1 возвращает два значения: 2 и 3. Для использования в составе выражения используется первое из них.

Так как вызов любой функции можно осуществить, написав произвольное выражение в командном окне MATLABа, то всегда можно совершить ошибку, связанную с несовпадением типов фактических и формальных параметров. MATLAB не выполняет никаких проверок на эту тему, а просто передаёт управление функции. В результате могут возникнуть ошибочные ситуации. Чтобы избежать ( по-возможности ) возникновения таких ошибочных ситуаций, предлагается в тексте M-функций осуществлять проверку входных параметров. Например, в функции MatrProc1 легко осуществить выявление ситуации, когда размеры первого и второго входных параметров различны. Для написания такого кода требуются конструкции управления, которые мы пока ещё не изучали. Самое время приступить к их изучению!


#$+Конструкции управления.

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

Такие конструкции часто называют операторами управления. К джентльменскому набору операторов управления относятся операторы ветвления и операторы цикла. Начнёс с операторов ветвления.

К операторам ветвления в M-языке относятся условный оператор и оператор переключения. Условный оператор использует ключевые слова

if ("если"), else ("иначе")

elseif ("иначе если"), end ("конец всей конструкции")

и может выступать в одной из следующих трёх форм.


Дата добавления: 2015-01-18 | Просмотры: 627 | Нарушение авторских прав



1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |



При использовании материала ссылка на сайт medlec.org обязательна! (0.015 сек.)