Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 



Вычисления в интерактивном режиме. 4 часть



Например, если мы хотим создать графический файл в формате популярного пакета векторной графики Illustrator, то вместо options надо будет подставить dill :

print -dill FileName

В результате выполнения этой команды на диске будет записан файл FileName.ai, где расширение ai характерно для пакета Illustrator. Далее этот файл можно открыть в пакете Illustrator и осуществлять его дальнейшее редактирование уже в рамках этого мощного пакета векторной графики.

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

[X,map]=capture(1);

imwrite(X,map,'myfile1.jpg')

Создаёт файл myfile1.jpg, который хорошо включать в Internet-страницы для их просмотра браузером Internet Explorer.

Функция capture возвращает матрицу X, соответствующую точкам изображения, и матрицу цветов map (три столбца в формате RGB), использованную в изображении. Каждый элемент матрицы X равен номеру одной из строк матрицы map.

В системе MATLAB по матрицам X и map можно восстановить графическое изображение, применив команды

colormap( map );

image( X );

но этот разговор уже касается объектов image системы MATLAB, которым мы посвятим специальный раздел.

6. Показ произвольных растровых изображений.Произвольное изображение на экране компьютера представляет собой массив пикселов, каждый из которых характеризуется своим цветом. Цвет пиксела определяется тремя составляющими: красным, зелёным и синим (Red, Green, Blue - RGB). Для задания величины составляющей цвета пиксела достаточно одного байта памяти (8 битов), где можно записать целые числа от нуля до 255 (всего 256 значений).

Итак, каждому пикселу экрана должны соответствовать три целых числа в диапазоне от 0 до 255. В системе MATLAB таким целым числам соответствует тип данных, обозначаемый как uint8. Под такой тип данных отводится в памяти всего один байт, вместо 8 байт для обычных вещественных (дробных) чисел типа double. По умолчанию любой переменной в системе MATLAB ставится в соответствие тип double независимо от числовых значений, которые вы присваиваете переменным.

Например, в результате следующей строки кода

iVar1 = 128;

создаётся переменная с именем iVar1 и типом double, которой присваивается значение 128. Для хранения такого значения достаточно одного байта памяти, однако для переменной iVar1 типа double отводится 8 байт памяти. Налицо явный перерасход памяти компьютера.

Чтобы избежать такого перерасхода переменную нужно явно объявлять как целую, используя модификатор uint8:

iVar2 = uint8( 128 );

Так созданная переменная iVar2 считается целой переменной (а не вещественной), и под неё отводится один байт памяти. Такие переменные в системе MATLAB специально предназначены для хранения целых значений от 0 до 255 (с целью экономии памяти) и не предназначены для вычислений! По-крайней мере в версии MATLAB 5.2 это ещё так. В результате для следующего фрагмента

iVar2 = iVar2 + 1;

получаем сообщение об ошибке:

??? Function '+' not defined for variables of class 'uint8'.

Дословно означающее, что операция "сложение" для переменных типа uint8 не определена.

Чтобы узнать (если забыли), какой тип имеет та или иная переменная из рабочего пространства системы MATLAB, нужно ввести и выполнить команду

whos

 
 

в результате в командном окне MATLABа появится следующее сообщение:

из которого видно, что iVar1 является массивом размера 1x1 (то есть фактически скаляром) типа double и занимает в памяти 8 байт, а iVar2 имеет тип uint8 и занимает в памяти только 1 байт (в 8 раз меньше). При этом обе переменные имеют одинаковые значения.

Некоторый набор цветов (в количестве m штук), называемый палитрой или colormap, можно оформить в виде матрицы размером m x 3 типа double. Например, матрица map1

map1(1,1) = 0.12; map1(1,2) = 0.123; map1(1,3) = 0.987;

map1(2,1) = 0.456; map1(2,2) = 0.7; map1(2,3) = 0.22;

map1(3,1) = 0.88; map1(3,2) = 0.19; map1(3,3) = 0.611;

map1(4,1) = 0.255; map1(4,2) = 0.298; map1(4,3) = 0.128;

map1(5,1) = 0.01; map1(5,2) = 0.78; map1(5,3) = 0.60;

задаёт набор из пяти цветов. Каждая строка соответствует одному цвету. Элементы строки (слева - направо) задают красную, зелёную и синию составляющие цвета.

Далее сформируем матрицу k x L типа uint8, каждый элемент которой будет равен одному из номеров (минус единица) строк таблицы цветов map1. Такой матрицы вместе с матрицей цветов будет достаточно, чтобы показать на экране компьютера массив пикселов, то есть произвольное изображение.

Например, матрица X1

X1=uint8( [ 1 4 1 3 2; 4 0 2 1 3 ] )

задаёт массив типа uint8 размером 2 x 5 пиксел. Этот массив всего занимает в памяти 10 байт, а не 80 байт, как было бы в случае массива типа double. Первый пиксел в первом ряду имеет цвет, задаваемый второй строкой матрицы map1, второй пиксел в этом же ряду соответствует пятой строке матрицы map1, и так далее.

Чтобы заставить систему MATLAB реально отобразить произвольную картину пикселов, нужно вызвать функцию image.

Например, с помощью функций

image( X1 ); colormap( map1 );

 
 

создаётся графический объект Image системы MATLAB, которому в графическом окне MATLABа соответствует реальное изображение:

Поскольку мы не управляем размером графического окна системы MATLAB, то оно появляется на экране с некоторым разумным размером, заданным по умолчанию. Далее, так как наше изображение состоит из двух рядов по пять пиксел в каждом, а это очень мелкое изображение (физический размер пиксела экрана примерно равен 0.2 мм), то MATLAB по умолчанию масштабирует его (увеличивает), чтобы можно было разглядеть это изображение. Если требуется отменить такое масштабирование, то следует указать явно нужные размеры:

[ m , n ] = size( X1 );

figure( 'Units', 'pixels', 'Position', [100 100 n m] );

image( X1 ); colormap( map1 );

Здесь размеры m и n изображения X1 навязываются в качестве физического размера картинки в графическом окне системы MATLAB. Для слишком маленьких картинок при этом ничего хорошего не получится.

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

[ X2, map2 ] = imread( 'myfile1.jpg' )

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

Рассмотренное нами строение данных для объекта Image, состоящее из двух матриц, одна из которых построчно задаёт цвета, а вторая своими элементами указывает входы в таблицу ( матрицу ) цветов, называется более точно как Indexed Image (индексированное изображение). Есть и другой тип объекта Image - так называемый Truecolor Image (картинки с очень большим количеством цветов - до 16 миллионов). Этот второй тип объектов Image устроен по-другому.

Для TruecolorImage- объектов таблица цветов не требуется, так как массивы данных таких объектов непосредственно определяют цвета.

Эти массивы имеют размер m x n x 3 (это массивы размерности 3). Величины m и n определяют размер картинки на экране (m x n пикселов), а вдоль третьего направления располагаются RGB-составляющие цвета каждого пиксела. Зададим для примера следующий массив для изображения TrueColor:

xTrue(1,1,1) = uint8( 127 ); xTrue(1,1,2) = uint8( 127 ); xTrue(1,1,3) = uint8( 127 );

xTrue(1,2,1) = uint8( 19 ); xTrue(1,2,2) = uint8( 12 ); xTrue(1,2,3) = uint8( 255 );

xTrue(1,3,1) = uint8( 245); xTrue(1,3,2) = uint8( 127 ); xTrue(1,3,3) = uint8( 1 );

xTrue(2,1,1) = uint8( 6 ); xTrue(2,1,2) = uint8( 203 ); xTrue(2,1,3) = uint8( 128 );

xTrue(2,2,1) = uint8( 100 ); xTrue(2,2,2) = uint8( 1 ); xTrue(2,2,3) = uint8( 80 );

xTrue(2,3,1) = uint8( 60 ); xTrue(2,3,2) = uint8( 249 ); xTrue(2,3,3) = uint8( 5 );

Массив xTrue создаёт изображение 2 x 3 пиксела с помощью вызова одной функции image( xTrue ):

 
 

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

[ X, map ] = imread( 'name.xxx' )

В случае TrueColor изображений здесь матрица X получит размер

m x n x 3

а матрица палитры map будет пустой:

size( map ) =

0 0

В дальнейшем функция image автоматически по размеру матрицы X распознаёт типы изображений и действует в обоих случаях как надо, а функция colormap в случае пустого массива map не делает ничего, так что оба этих случая могут быть обработаны одинаково.

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

X = imread( 'name.xxx' )

а показывали бы изображение вызовом только одной функции image( X ).

Чтобы заранее узнать тип изображения в файле, нужно вызвать функцию

imfinfo( 'name.xxx' )

 
 

В частности для файла 'myfile1.jpg', созданного в предыдущем разделе данного пособия, функция imfinfo выдаст следующую информацию:

Отсюда видно, что тип изображения в файле (ColorType) есть truecolor. Это означает, что можно полностью обойтись без матрицы цветов.

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

1. Понятия функции и сценария.Работая в интерактивном режиме, приходится всё время вводить нужные команды с клавиатуры. Затем, в следующих сеансах работы с системой 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-функций.

2. Синтаксис определения и вызова 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 легко осуществить выявление ситуации, когда размеры первого и второго входных параметров различны. Для написания такого кода требуются конструкции управления, которые мы пока ещё не изучали. Самое время приступить к их изучению!

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

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

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

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

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

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

Во-первых,

if условие

end

Во-вторых,

if условие

else

end

И, наконец, в форме

if условие1

elseif условие2

else

end

в которой ветвей с ключевым словом elseif может быть много.

Область действия условного оператора начинается ключевым словом if, а заканчивается ключевым словом end. Под условием понимается произвольное выражение (чаще всего это выражение включает в себя операции сравнения и логические операции), истинность или ложность которого понимается как отличие или равенство нулю.

Если условие истинно, то выполняются команды, стоящие после строки с ключевым словом if. Если условие ложно, то эти команды пропускаются и переходят либо к следующему за условным оператору (первая форма), либо проверяют ещё одно условие в строке с ключевым словм elseif (третья форма условного оператора), либо выполняются без дополнительных проверок команды, стоящие после строки с ключевым словом else (вторая из приведённых выше форм). Более побробных объяснений по работе условного оператора не требуется, так как перевод ключевых слов говорит сам за себя.

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

Приведём иллюстрирующий работу условного оператора фрагмент кода

A = [ 1 2; 4 0 ];

if A

b = 1;

else

b =2;

в результате выполнения которого переменная b получит значение 2, так как матрица A содержит один нулевой элемент, и всё условие считается ложным.

Кстати, запись if A по своему действию полностью эквивалентна записи if A~=0 и записи if all( A( : ) ).

Оператор переключения использует ключевые слова switch ("переключить"), case ("случай"), otherwise ("иначе") и имеет следующую конструкцию:

switch выражение

case значение1

case { значение2, значение3 }

otherwise

end

Сначала вычисляется вырабатывающее скалярное числовое значение выражение, а затем полученный результат сравнивается с набором значений значение1, значение2, значение3 и так далее. В случае совпадения с одним из значений, выполняется нижестоящая ветка. Если нет совпадения ни с каким из перечисленных значений, то выполняется ветка, стоящая после ключевого слова otherwise. Строк с ключевым словом case может быть много, а строка с ключевым словм otherwise - одна.

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

Первый из них использует ключевые слова for ("для") и end. Он имеет вид

while выражение

end

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

Следующий фрагмент вычисляет сумму отрезка ряда:

S=0; k=1; u=1;

while u > 1e-8

S = S + u;

k = k + 1; u = 1/k^2;

end

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

Другой вариант оператора цикла использует ключевые слова for (" для") и end. Он имеет вид:

for varName = выражение

end

где varName - произвольно выбираемое программистом имя так называемой переменной цикла. В отличие от первого варианта оператора цикла здесь легко прогнозировать количество итераций (повторов), так как тело цикла (обозначено многоточием) выполняется для всех возможных значений переменной varName. Набор возможных значений для переменной цикла поставляет выражение.

Чаще всего выражение представлено с помощью ранее изученной операции "диапазон значений". В следующем фрагменте кода осуществляется сложение 57 членов ряда:

S=0;

for k = 1 : 1 : 57

S = S + 1/k^2;

end

При каждом новом проходе переменная цикла k увеличивается на единицу. Как легко заметить, здесь осуществляется суммирование того же ряда, что и в примере, посвящённом оператору цикла while…end. В предыдущем примере условием останова было требование к величине очередного слагаемого, а теперь этим условием является исчерпание всех возможных значений переменной цикла. В итоге можно сделать вывод, что использование того или иного варианта оператора цикла диктуется особенностями конкретной математической задачи.

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

for m = [ 2, 5, 7, 8, 11, 23 ]

что приведёт к шести итерациям. При первой итерации переменная цикла m будет равна 2, при втором - 5 и так далее до исчерпания всех возможных значений.

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

A = [ 1 2; 3 4];

for k = A

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

Например, следующий фрагмент

S=0; A = [ 1 2; 3 4];

for k = A

S = S + sqrt( k(1)^2 + k(2)^2 );

end

вычисляет сумму "длин" столбцов матрицы A.

Оба вида операторов цикла можно прервать, если применить оператор break внутри тела цикла.

Для повышения эффективности программы везде, где это возможно, вместо операторов цикла лучше применять эквивалентные по результатам операции с массивами, так как последние исполняются в системе MATLAB быстрее. Например, вместо

k=0;

for x = 0 : 0.1 :100

k=k+1; y( k ) = cos( x );

end

лучше использовать операции с массивами:

x = 0 : 0.1 : 100; y = cos( x );

так как они быстрее исполняются и записываются короче.

4. Проверка входных параметров и выходных значений M-функции.Как мы говорили выше, несовпадение типов и числа фактических и формальных параметров в M-функции приводит к их неправильной работе. Но "пользователь" M-функции всегда может ошибиться при её вызове. Поэтому желательно встраивать внутрь кода M-функций проверки входных параметров.

Ранее рассмотренная в пункте 2 функция MatrProc1 предполагала использовать в качестве первого и второго аргументов массивы одинаковых размеров. Если пользователь по ошибке задаст фактические параметры в виде массивов разных размеров, то в процессе выполнения функции возникнет ошибка. Чтобы избежать этого, можно в теле функции MatrProc1 организовать проверку размеров первого и второго параметров:

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

if size( X1 ) ~= size( X2 )

error( 'Bad 1st and 2nd parameters' )

end

A = X1 .* X2 * x;

B = X1 .* X2 + x;

Теперь при вызове функции MatrProc1 с неправильными размерами первого и второго аргументов, стандартная функция системы MATLAB error будет корректно останавливать всю работу и выводить в командное окно MATLABа наше диагностическое сообщение (аргумент функции error), после чего пользователю останется лишь повторно вызвать функцию MatrProc1, но уже с правильными параметрами.



Просмотров 922

Эта страница нарушает авторские права




allrefrs.su - 2025 год. Все права принадлежат их авторам!