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

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

Прочитайте:
  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 | Просмотры: 732 | Нарушение авторских прав



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.006 сек.)