1. Полиномиальная интерполяция

 

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

yi = interp1(x, y, xi, method)

 

где y есть вектор, содержащий значения функции; x – вектор такой же длины, содержащий те точки (значения аргумента), в которых заданы значения y; вектор xi содержит те точки, в ко-торых мы хотим найти значения вектора y путем интерполяции; method – дополнительная строка, задающая метод интерполяции. Имеются следующие возможности для выбора мето-да:

 • Ступенчатая интерполяция (method = 'nearest'). Этот метод приравнивает значение функ-ции в интерполируемой точке к ее значению в ближайшей существующей точке имеющихся данных.

 • Линейная интерполяция (method = 'linear'). Этот метод аппроксимирует функцию между любыми двумя существующими соседними значениями как линейную функцию, и возвр-ащает соответствующее значение для точки в xi (метод используется по умолчанию).

 • Интерполяция кубическими сплайнами (method = 'spline'). Этот метод аппроксимирует ин-терполируемую функцию между любыми двумя соседними значениями при помощи куби-ческих функций, и использует сплайны для осуществления интерполяции.

 • Кубическая интерполяция (method = 'pchip' или 'cubic'). Эти методы идентичны. Они ис-пользуют кусочную кубическую Эрмитову аппроксимацию и сохраняют монотонность и форму данных.

Если какой-либо из элементов вектора xi находится вне интервала, заданного вектором x, то выбранный метод интерполяции используется также и для экстраполяции. Как альтернатива,

функция yi = interp1(x, y, xi, method, extrapval) заменяет экстраполированные значения теми, которые заданы вектором extrapval. Для последнего часто используется нечисловое значение NaN.

Все методы работают на неравномерной сетке значений вектора x .

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

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

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

 • Кубическая интерполяция сплайнами требует наибольшего времени исполнения, хотя тре-бует меньших объемов памяти чем кубическая интерполяция. Она дает самый гладкий ре-зультат из всех других методов, однако вы можете получить неожиданные результаты, если входные данные распределены неравномерно и некоторые точки слишком близки.

 • Кубическая интерполяция требует большей памяти и времени исполнения чем ступенчатая или линейная. Однако в данном случае как интерполируемые данные, так и их производные являются непрерывными.

Относительные качественные характеристики всех перечисленных методов сохраняются и в случае двух- или многомерной интерполяции.


2. Интерполяция на основе быстрого преобразования Фурье _

 

Функция interpft осуществляет одномерную интерполяцию с использованием быстрого пре-образование Фурье (FFT). Этот метод вычисляет преобразование Фурье от вектора, который содержит значения периодической функции. Затем вычисляется обратное преобразование Фурье с использованием большего числа точек. Функция записывается в форме

y = interpft(x, n)

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

Двумерная интерполяция

 

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

ZI = interp2(X, Y, Z, XI, YI, method)

 

где Z есть прямоугольный массив, содержащий значения двумерной функции; X и Y являют-ся массивами одинаковых размеров, содержащие точки в которых заданы значения двумер-ной функции; XI и YI есть матрицы, содержащие точки интерполяции (то есть промежуточ-ные точки, в которых нужно вычислить значения функции); method – строка, определяющая метод интерполяции. В случае двумерной интерполяции возможны три различных метода:

 • Ступенчатая интерполяция (method = 'nearest'). Этот метод дает кусочно-постоянную поверхность на области значений. Значение функции в интерполируемой точке равно значе-нию функции в ближайшей заданной точке.

 • Билинейная интерполяция (method = 'linear'). Метод обеспечивает аппроксимацию данных при помощи билинейной поверхности (плоскости) на множестве заданных значений двумер-ной функции. Значение в точке интерполяции является комбинацией значений четырех бли-жайших точек. Данный метод можно считать «кусочно-билинейным»; он быстрее и требует меньше памяти, чем бикубическая интерполяция.

 • Бикубическая интерполяция (method = 'cubic'). Данный метод аппроксимирует поверх-ность при помощи бикубических поверхностей. Значение в точке интерполяции является комбинацией значений в шестнадцати ближайших точках. Метод обеспечивает значительно более гладкую поверхность по сравнению с билинейной интерполяцией. Это может быть ключевым преимуществом в приложениях типа обработки изображений. Особенно эффек-тивным данный метод является в ситуациях, когда требуется непрерывность как интерполи-руемых данных, так и их производных.

Все эти методы требуют, чтобы X и Y были монотонными, то есть или всегда возрастающи-ми или всегда убывающими от точки к точке. Эти матрицы следует сформировать с исполь-зованием функции meshgrid, или же, в противном случае, нужно убедиться, что «схема» то-чек имитирует сетку, полученную функцией meshgrid. Перед интерполяцией, каждый из указанных методов автоматически отображает входные данные в равномерно распреде-ленную сетку. Если X и Y уже распределены равномерно, вы можете ускорить вычисления добавляя звездочку к строке метода, например, '*cubic'.

Сравнение методов интерполяции

 

Приведенный ниже пример сравнивает методы двумерной интерполяции в случае матрицы данных размера 7х7.

Сформируем функцию peaks на «грубой» сетке (с единичным шагом).

[x, y] = meshgrid(-3 : 1 : 3);

z = peaks(x,y);

surf(x,y,z)

 

где функция meshgrid(-3:1:3) задает сетку на плоскости x и y в виде двумерных массивов размера 7х7; функция peaks(x,y) является двумерной функцией, используемой в MATLAB-е в качестве стандартных примеров, а surf(x,y,z) строит окрашенную параметрическую повер-хность. Соответствующий график показан ниже.

Создадим теперь более мелкую сетку для интерполяции (с шагом 0.25).

[xi,yi] = meshgrid(-3:0.25:3);

Осуществим интерполяция перечисленными выше методами.

zi1 = interp2(x,y,z,xi,yi,'nearest');

zi2 = interp2(x,y,z,xi,yi,'bilinear');

zi3 = interp2(x,y,z,xi,yi,'bicubic');

 

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

surf(xi,yi,zi1) surf(xi,yi,zi2) surf(xi,yi,zi3)

 

Метод  ‘nearest’ Метод ‘bilinear’ Метод ‘bicubic’

 

Интересно также сравнить линии уровней данных поверхностей, построенных при помощи специальной функции contour.

 

contour(xi,yi,zi1) contour(xi,yi,zi2) contour(xi,yi,zi3)

Метод  ‘nearest’ Метод ‘bilinear’ Метод ‘bicubic’

 

Отметим, что бикубический метод производит обычно более гладкие контуры. Это, однако, не всегда является основной заботой. Для некоторых приложений, таких, например, как об-работка изображений в медицине, метод типа ступенчатой интерполяции может быть более предпочтительным, так как он не «производит» никаких «новых» результатов наблюдений.

 

 

 

Анализ данных и статистика

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

Optimization – Нелинейные методы обработки данных и оптимизация. Signal Processing – Обработка сигналов, фильтрация и частотный анализ. Spline – Аппроксимация сплайнами. Statistics – Углубленный статистический анализ, нелинейная аппроксимация и

регрессия.

Wavelet - Импульсная декомпозиция сигналов и изображений.

 

Внимание ! MATLAB выполняет обработку данных, записанных в виде двумерных массивов по столбцам ! Одномерные статистические данные обычно хранятся в отдельных векорах, причем n-мерные векторы могут иметь размерность 1х n или nх1. Для многомерных данных матрица является естественным представлением, но здесь имеются две возможности для ориентации данных. По принятому в системе MATLAB соглашению, различные пере-менные должны образовывать столбцы, а соответствующие наблюдения - строки. Поэтому, например, набор данных, состоящий из 24 выборок 3 переменных записывается в виде мат-рицы размера 24х3.

 

Основные функции обработки данных

Перечень функций обработки данных, расположенных в директории MATLAB-а datafun приведен в Приложении 8 .

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

 

count =

11 11 9

7 13 11

 14 17 20

11 13 9

 43 51 69

38 46 76

61 132 186

75 135 180

38 88 115

28 36 55

12 12 14

18 27 30

18 19 29

17 15 18

19 36 48

32 47 10

42 65 92

57 66 151

44 55 90

114 145 257

35 58 68

11 12 15

13 9 15

 10 9 7

Таким образом, мы имеем 24 наблюдения трех переменных. Создадим вектор времени, t, со-стоящий из целых чисел от 1 до 24: t = 1 : 24. Построим теперь зависимости столбцов матри-цы counts от времени и надпишем график:

 plot(t, count)

legend('Location 1','Location 2','Location 3',0)

xlabel('Time')

ylabel('Vehicle Count')

grid on

 где функция plot(t, count) строит зависимости трех векторов-столбцов от времени; функция

legend('Location 1','Location 2','Location 3',0) показывает тип кривых; функции xlabel и  ylabel надписывают координатные оси, а grid on выводит координатную сетку. Соответству-ющий график показан ниже.

Применим к матрице count функции max (максимальное значение), mean (среднее значение) и std (стандартное, или среднеквадратическое отклонение).

mx = max(count)

 mu = mean(count)

 sigma = std(count)

 

В результате получим

mx =

114 145 257

mu =

32.00 46.5417 65.5833

sigma =

25.3703 41.4057 68.0281

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

[mx,indx] = min(count)

mx =

7 9 7

indx =

2 23 24

показывает, что наименьшее число машин за час было зарегестрировано в 2 часа для первого пункта наблюдения (первый столбец) и в 23 и 24 чч. для остальных пунктов наблюдения.

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

e = ones(24, 1)

x = count - e*mu

 

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

min(count(:))

что приводит к результату

ans =

7

Запись count(:) в данном случае привела к перегруппировке матрицы размера 24х3 в вектор-столбец размера 72х1.

Матрица ковариаций и коэффициенты корреляции

 

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

cov – В случае вектора данных эта функция выдает дисперсию, то есть меру распреде-

ления (отклонения) наблюдаемой переменной от ее среднего значения. В случае

матриц это также мера линейной зависимости между отдельными переменными,

определяемая недиагональными элементами.

corrcoef – Коэффициенты корреляции – нормализованная мера линейной вероятност-ной зависимости между перменными.

Применим функцию cov к первому столбцу матрицы count

cov(count(:,1))

Результатом будет дисперсия числа машин на первом пункте наблюдения

ans =

643.6522

Для массива данных, функция cov вычисляет матрицу ковариаций. Дисперсии столбцов мас-сива данных при этом расположены на главной диагонали матрицы ковариаций. Остальные элементы матрицы характеризуют ковариацию между столбцами исходного массива. Для матрицы размера mхn, матрица ковариаций имеет размер n-by-n и является симметричной, то есть совпадает с транспонированной.

Функция corrcoef вычисляет матрицу коэффициентов корреляции для массива данных, где каждая строка есть наблюдение, а каждый столбец – переменная. Коэффициент корреляции – это нормализованная мера линейной зависимости между двумя переменными. Для некор-релированных (линейно-независимых) данных коэффициент корреляции равен нулю; экива-лентные данные имеют единичный коэффициент корреляции. Для матрицы mхn, соответст-вующая матрица коэффициентов корреляции имеет размер nхn. Расположение элементов в матрице коэффициентов корреляции аналогично расположению элементов в рассмотренной выше матрице ковариаций. Для нашего примера подсчета количества машин, при вводе

corrcoef(count)

получим

ans =

1.0000 0.9331 0.9599

0.9331 1.0000 0.9553

0.9599 0.9553 1.0000

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

Конечные разности

 

MATLAB предоставляет три функции для вычисления конечных разностей.

Функция Описание

diff

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

gradient

Приближенное вычисление градиента функции.

del2

Пятиточечная аппроксимация Лапласиана.

Функция diff вычисляет разность между последовательными элементами числового вектора, то есть diff(X) есть [X(2) -X(1) X(3) -X(2) ... X(n) -X(n-1)]. Так, для вектора A,

A = [9 -2 3 0 1 5 4];

diff(A)

MATLAB возвращает

ans =

-11 5 -3 1 4 -1

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

Применение (тест)

Описание

diff(x) == 0

Тест на определение повторяющихся элементов

all(diff(x) > 0)

Тест на монотонность

all(diff(diff(x)) == 0)

Тест на опредедление равных приращений

Обработка данных

 

В данном разделе рассматривается как поступать с:

Отсутствующими значениями Выбросами значений или несовместимыми («неуместными») значениями

 

Отсутствующие значения

Специальное обозначение NaN, соответствует в MATLAB-е нечисловое значение. В соответ-ствие с принятыми соглашениями NaN является результатом неопределенных выражений та-ких как 0/0. Надлежащее обращение с отсутствующими данными является сложной пробле-мой и зачастую меняется в различных ситуациях. Для целей анализа данных, часто удобно использовать NaN для представления отсутствующих значений или данных которые недос-тупны. MATLAB обращается со значениями NaN единообразным и строгим образом. Эти значения сохраняются в процессе вычислений вплоть до конечных результатов. Любое мате-матическое действие, производимое над значением NaN, в результате также производит NaN. Например, рассмотрим матрицу, содержащую волшебный квадрат размера 3х3, где це-нтральный элемент установлен равным NaN.

a = magic(3); a(2,2) = NaN;

a =

8 1 6

3 NaN 7

4 9 2

Вычислим сумму элементов всех столбцов матрицы:

sum(a)

ans =

15 NaN 15

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

Программа Описание

i = find( ~ isnan(x));

x = x(i)

 Найти индексы всех эементов вектора, не равных

NaN, и затем сохранить только эти элементы

x = x (find( ~ isnan(x)))

 Удалить все NaN-ы из вектора

x = x ( ~ isnan(x));

 Удалить все NaN-ы из вектора (быстрее).

x (isnan(x)) = [ ];

 Удалить все NaN-ы из вектора

X (any(isnan(X’)), :) = [ ];

 Удалить все строки матрицы X содержащие NaN-ы

 

Внимание. Для нахождения нечисловых значений NaN вам следует использовать специаль-ную функцию isnan, поскольку при принятом в MATLAB-е соглашении, логическое сравне-ние NaN == NaN всегда выдает 0. Вы не можете использовать запись x(x==NaN) = [ ] для удаления NaN-ов из ваших данных.

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

function X = excise(X)

X(any(isnan(X')),:) = [ ];

Тогда. напечатав

X = excise(X);

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

Удаление выбросов значений

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

mu = mean(count)

 

sigma = std(count)

 

 mu =

32.0000 46.5417 65.5833

 

sigma =

25.3703 41.4057 68.0281

Число строк с выбросами значений, превышающими утроенное среднеквадратическое откло-нение от среднего значения можно получить следующим образом:

[n, p] = size(count)

 

outliers = abs(count - mu(ones(n, 1),:)) > 3*sigma(ones(n, 1),:);

 

nout = sum(outliers)

 

nout =

1 0 0

Имеется только один выброс в первом столбце. Удалим все наблюдение при помощи выра-жения

count(any(outliers'),:) = [ ];


Регрессия и подгонка кривых

 

Часто бывает полезным или необходимым найти функцию, которая описывает взаимосвязь между некоторыми наблюдаемыми (или найденными экспериментально) переменными. Оп-ределение коэффициентов такой функции ведет к решению задачи переопределенной систе-мы линейных уравнений, то есть системы, у которой число уравнений превышает число не-известных. Указанные коэффициенты можно легко найти с использованием оператора обрат-ного деления \ (backslash). Допустим, вы производили измерения переменной y при разных значениях времени t.

t = [0 0.3 0.8 1.1 1.6 2.3]';

 

y = [0.5 0.82 1.14 1.25 1.35 1.40]';

 

plot(t,y,'o'); grid on

В следующих разделах мы рассмотрим три способа моделирования (аппроксимации) этих данных:

Методом полиномиальной регрессии Методом линейно-параметрической (linear-in-the-parameters) регрессии Методом множественной регрессии

 

Полиномиальная регрессия

 

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

y = a0 + a1t + a2t2

Неизвестные коэффициенты a0 , a1 и a2 могут быть найдены методом среднеквадратичес-кой подгонки (аппроксимации), которая основана на минимизации суммы квадратов отклоне-ний данных от модели. Мы имеем шесть уравнений относительно трех неизвестных,

 представляемых следующей матрицей 6х3:

X = [ones(size(t)) t t.^2]

 

X = 1.0000 0 0

 1.0000 0.3000 0.0900

 1.0000 0.8000 0.6400

 1.0000 1.1000 1.2100

1.0000 1.6000 2.5600

1.0000 2.3000 5.2900

Решение находится при помощи оператора \ :

a = X\y

a =

0.5318

0.9191

- 0.2387

Следовательно, полиномиальная модель второго порядка наших данных будет иметь вид

y = 0.5318 + 0.9191t – 0.2387 t2

Оценим теперь значения модели на равноотстоящих точках (с шагом 0.1) и нанесем кривую на график с исходными данными.

T = (0 : 0.1 : 2.5)';

 

Y = [ones(size(T)) T T.^2]*a;

 

plot(T,Y,'-',t,y,'o'); grid on

 

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


Линейно-параметрическая регрессия[1]

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

y = a0 + a1-t + a2t℮-t

Здесь также, неизвестные коэффициенты a0 , a1 и a2могут быть найдены методом наимень-ших квадратов. Составим и решим систему совместных уравнений, сформировав регресси-онную матрицу X, и применив для определения коэффициентов оператор \ :

X = [ones(size(t)) exp(- t) t.*exp(- t)];

 

a = X\y

 

a =

1.3974

- 0.8988

0.4097

Значит, наша модель данных имеет вид

y = 1.3974 – 0.8988℮-t + 0.4097t℮-t

Оценим теперь, как и раньше, значения модели на равноотстоящих точках (с шагом 0.1) и на-несем эту кривую на график с исходными данными.

Как видно из данного графика, подгонка здесь намного лучше чем в случае полиномиальной функции второго порядка.

Множественная регрессия

 

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

x1 = [0.2 0.5 0.6 0.8 1.0 1.1]' ;

 

x2 = [0.1 0.3 0.4 0.9 1.1 1.4]' ;

 

y = [0.17 0.26 0.28 0.23 0.27 0.24]' ;

 

Множественную модель данных будем искать в виде

y = a0 + a1x1 + a2x2

Методы множественной регрессии решают задачу определения неизвестных коэффициентов a0 ,  a1 и a2 путем минимизации среднеквадратической ошибки приближения. Составим сов-местную систему уравнений, сформировав матрицу регрессии X и решив уравнения отно-сительно неизвестных коэффициентов, применяя оператор \ .

X = [ones(size(x1)) x1 x2];

 

a = X\y

 

a =

0.1018

0.4844

-0.2847

Следовательно, модель дающая минимальную среднеквадратическую ошибку аппроксима-ции имеет вид

y = 0.1018 + 0.4844x1 – 0.2847x2

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

Y = X*a;

 

MaxErr = max(abs(Y - y))

 

MaxErr =

0.0038

Эта ошибка дает основание утверждать, что наша модель достаточно адекватно отражает ре-зультаты наблюдений.


Графический интерфейс подгонки кривых

 

MATLAB дает возможность осуществлять аппроксимацию данных наблюдений при помощи специального графического Интерфейса Подгонки Кривых (ИПК) (в английском оригинале - Basic Fitting interface). Используя данный интерфейс, вы можете легко и быстро решить множество задач подгонки кривых, получая при этом самую разнообразную информацию о результатах вашей подгонки. ИПК предоставляет следующие возможности:

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

Основываясь на ваших конкретных задачах и приложениях, вы можете использовать ИПК, возможности, предоставляемыми командным окном, или же комбинировать эти две возмож-ности. Отметим, что ИПК предназначен только для работы с одномерными и двумерными данными.

Рассмотрение основных свойств ИПК

 

Общий вид ИПК показан ниже.

Для его вызова в подобном виде, нужно выполнить следующие три шага:

Построить какой либо график данных. Выбрать опцию Basic Fitting из меню Tools вашего графического окна. Нажать дважды на кнопку More в нижней части ИПК. В результате откроется окно c тремя панелями (см. рисунок), а сама надпись заменится на Less.

Рассмотрим основные опции ИПК.

Select data (Выбор данных) – В данном окне расположен список всех переменных, построен-ных на активном графике, с которым связан ИПК (на графике может быть построено неско-лько кривых). Используйте данный список для выбора требуемого (текущего) набора дан-ных. Под текущим подразумевается тот набор данных, для которого вы хотите осуществить подгонку. За один раз вы можете осуществлять действия только с одним набором данных. С другой стороны, вы можете произвести различные подгонки для текущего набора данных за счет изменения названия этих данных. С этой целью можно воспользоваться так называемым Редактором Графиков (Plot Editor), который будет рассмотрен в дальнейшем.

Center and scale X data (Центрирование и масштабирование данных X) – Если данная опция выбрана, то данные центрируются (нуль переносится в среднее значение данных) и масшта-бируются к единичному стандартному отклонению (делятся на исходное стандартное откло-нение). Это может потребоваться для повышения точности последующих математических вычислений. Если подгонка приводит к результатам, которые могут быть неточными, соот-ветствующее предупреждение выводится на экран.

 

Plot fits (Подгонка кривых) – Эта панель позволяет визуально просмотреть результаты одной или более подгонок текущего набора данных.

Check to display fits on figure (Отметьте методы для вывода на график) – Выберите методы подгонок, которые вы хотели бы использовать и вывести на график. Здесь имеются две основные возможности – выбор интерполянтов и выбор полиномов. Сплайновый интерполянт использует для аппроксимации сплайны, тогда как эрми-товый интерполянт использует специальную функцию pchip (Piecewise Cubic Hermite Interpolating Polynomial - Кусочно-кубический Эрмитовый Интерполяционный Поли-ном). Полиномиальная подгонка использует функцию polyfit. Вы можете одновре-менно выбрать любые методы подгонки для аппроксимации ваших данных. Если ваш набор данных содержит N точек, вам следует использовать для аппроксимации поли-номы с не более чем N коэффициентами. В противном случае, ИПК автоматически приравнивает избыточное число коэффициентов нулю, что приводит к недоопреде-ленности системы. Укажем, что при этом на дисплей выдается соответствующее сооб-щение. Show equations (Показать уравнения) – При выборе данной опции, уравнение подгон-ки выводится на ваш график. Significant digits (Значащие разряды) – Выберите число значащих разрядов для выво-да на дисплей. Plot residuals (Построить графики разностей (невязок)) – При выборе данной опции, на график выводятся разности подгонок. Под разностью подгонки понимается раз-ность между исходными данными и результатами подгонки для каждого значения ар-гумента исходных данных. Вы можете построить графики невязок как столбчатую ди-аграмму (bar plot), как график рассеяния (scatter plot), или же как линейный график. Построения можно осуществлять как в том же графическом окне, так и в отдельном. При использовании подграфиков (subplots) для построения графиков многомерных данных, графики разностей могут быть построены только в отдельном графическом окне. Show norm of residuals (Показать норму разностей) – При выборе опции, на график выводятся также значения норм разностей. Норма разности является мерой качества подгонки, где меньшее значение нормы соответствует лучшему качеству. Норма рас-считывается при помощи функции norm(V,2), где V есть вектор невязок.

 

Numerical results (Численные результаты) – Данная панель позволяет изучать численные характеристики каждой отдельной подгонки для текущего набора данных, без построения графиков.

Fit (Метод подгонки) – Выберите метод подгонки. Соответствующие результаты бу-дут представлены в окне под меню выбора метода. Заметим, что выбор метода в дан-ной панели не оказывает воздействия на панель Plot fits. Поэтому, если вы хотите по-лучить графическое представление, следует выбрать соответствующую опцию в пане-ли Plot fits. Coefficients and norm of residuals (Коэффициенты и норма невязок) – В данном окне выводятся численные выражения для уравнения подгонки, выбранного в Fit. Отме-тим, что при первом открытии панели Numerical Results , в рассматриваемом окне выдаются результаты последней подгонки, выбранной вами в панели Plot fits. Save to workspace (Запомнить в рабочем пространстве) – Вызывает диалоговое окно, которое позволяет запомнить в рабочем пространстве результаты вашей подгонки.

Find Y = f(X) – Данная панель дает возможность произвести интерполяцию или экстраполя-цию текущей подгонки.

·     Enter value(s) (Введите данные) – Введите любое выражение, совместимое с систе-мой MATLAB для оценки вашей текущей подгонки в промежуточных или выходя-щих за пределы заданных аргументов точек. Выражение будет вычислено после на-жатия кнопки Evaluate (Вычислить), а результаты в табличной форме будут выве-дены в соответствующее окно ниже. Метод текущей подгонки при этом указан в ме-ню Fit.

·     Save to workspace (Запомнить в рабочем пространстве) – Вызывает диалоговое окно, которое позволяет запомнить в рабочем пространстве результаты вашей интерполя-ции.

·     Plot results (Построить графики) – При выборе данной опции, результаты интерполя-выводятся в графической форме на график данных.


Уравнения в конечных разностях и фильтрация

 

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

Функция

 

y = filter(b, a, x)

 

обрабатывает данные в векторе x посредством фильтра, описываемого векторами a и  b, вы-давая фильтрованные данные y. Функция filter может рассматриваться как эффективная реа-лизация уравнения в конечных разностях. Структура функции filter является обобщенной структурой фильтра, образованного при помощи линий задержки, который описывается приведенными ниже уравнениями в конечных разностях, где n есть индекс (номер) текущей выборки, na есть порядок полинома, описываемого вектором a , а nb есть порядок полино-ма,описываемого вектором b. Выход y(n) является линейной комбинацией текущего и пре-дыдущих входов, то есть x(n) x(n-1) ..., и предыдущих выходов y(n-1) y(n-2) ...

a(1) y(n) = b(1) x(n) + b(2) x(n-1) + … + b(nb) x(n-nb+1) –

- a(2) y(n-1) - … - a(na) y(n-na+1)

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

y(n) = (1/4) x(n) + (1/4) x(n-1) + (1/4) x(n-2) + (1/4) x(n-3)

Соответствующие векторы равны:

 

a = 1; b = [1/4 1/4 1/4 1/4];

Воспользуемся данными матрицы count из раздела Анализ данных и статистика. Для на-шего примера, обозначим первый столбец матрицы count через вектор x :

x = count(:, 1);

 

Усредненные за 4 часа данные могут быть легко вычислены при помощи приведенной выше функции y = filter(b, a, x). Сравним исходные и сглаженные данные, построив их на одном графике.

 

t = 1:length(x) ;

plot(t, x, '-.', t, y, '-');  grid on

legend('Original Data','Smoothed Data',2)

Исходные данные наблюдения представлены здесь штрих-пунктирной линией, а сглаженные за 4 часа данные – сплошной линией.

Для различных практических приложений, в специальном пакете Signal Processing Toolbox предусмотрены многочисленные функции для анализа сигналов и проектирования дискрет-ных фильтров.

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

 

Многомерные массивы в системе MATLAB являются распространением обычных двумерных матриц. Как известно, матрицы имеют две размерности – строки (row) и столбцы (column).

 Вы можете выделить любой элемент двумерной матрицы при помощи двух индексов, где первый является индексом (номером) строки, а второй – индексом столбца. Многомерные массивы имеют дополнительную индексацию. Например, трехмерные массивы имеют три индекса:

Первый индекс указывает размерность 1 , то есть строки. Второй индекс указывает размерность 2. то есть столбцы. Третий индекс указывает на размерность 3. В данном пособии используется концепция страницы (page) для представления размерности 3 и выше.

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

Если вы добавляете размерности к массиву, вы также добавляете индексы. Четырехмерный массив, например, имеет 4 индекса. Первые два из них указывают на пару строка-столбец, а следующие два характеризуют третью и четвертую размерности.

Отметиим, что общие функции обращения с многомерными массивами находятся в директории datatypes.

Создание Многомерных Массивов

 

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

Создание массивов с использованием индексации

Один из способов формирования многомерного массива состоит в создании двумерного массива и соответствующего его расширения. Например, начнем с простого двумерного массива А.

A = [5 7 8; 0  1 9; 4 3 6];

 

А является массивом 3х3, то есть его размерности строк и столбцов равны трем. Для добавления третьей размерности к А запишем

A(:,:,2) = [1 0  4; 3 5 6; 9 8 7].

 

MATLAB выдаст

A(:, : ,1) =

5  7  8

0  1  9

4  3  6

 

A(:, :, 2) =

1  0  4

3  5  6

9  8  7

 

Вы можете продолжить добавление строк, столбцов или страниц аналогичным образом.

Расширение Многомерных Массивов. Для расширения любой размерности массива А нужно:

Увеличить или добавить соответствующий индекс и задать требуемые значения. Добавить такое же количество элементов к соответствующим размерностям массива. Так, для числовых массивов все строки должны иметь одинаковое число элементов, все страницы должны иметь одинаковое число строк и столбцов и т.д.

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

A(:, :, 3) = 5;

 

A(:, :, 3)

 

ans =

5  5  5

5  5  5

5 5  5

Для превращения А в четырехмерный массив размерности 3х3х3х2 введите

A(:, :, 1, 2) = [1 2 3; 4 5 6; 7 8 9];

A(:, :, 2, 2) = [9 8 7; 6 5 4; 3 2 1];

A(:, :, 3, 2) = [1 0 1; 1 1 0; 0 1 1];

 

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

 

Создание масивом с применением функций MATLAB-а.

Вы можете использовать для создания многомерных массивов такие функции MATLAB-а как randn, ones, и zeros, совершенно аналогично способу используемому для двумерных матриц. Каждый вводимый аргумент представляет размер соответствующей размерности в результирующем массиве. Например, для создания массива нормально распределенных случайных чисел размера 4х3х2 следует записать:

B = randn(4,3,2).

 

Для создания массива, заполненного единственным постоянным значением можно восполь-зоваться функцией repmat. Эта функция копирует массив (в нашем случае массив размера 1х1) вдоль вектора размерностей массива.

B = repmat(5,[3 4 2])

 

B(:, :, 1) =

5 5 5 5

5 5 5 5

5 5 5 5

 

B(:, :, 2) =

5 5 5 5

5 5 5 5

5 5 5 5

 

Внимание! Любая размерность массива может иметь размер 0, что просто дает пустой массив (empty array) . Так, размер 10х0х20 является допустимым размером многомерного массива.

 

Создание многомерного массива при помощи функции cat.

Функция cat дает простой путь построения многомерных массивов; она объединяет набор массивов вдоль заданной размерности.

B = cat (dim,A1,A2...)

 

где А1, А2 и т.д. являются объединяемыми массивами. а dim есть размерность, вдоль которой они объединяются. Например, для создания нового массива из двух двумерных матриц при помощи функции cat запишем

B = cat (3, [2 8; 0 5], [1 3; 7 9])

 

что дает трехмерный массив с двумя страницами

B(:, :, 1) =

2  8

0  5

 

B(:, :, 2) =

1 3

7 9

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

A = cat (3, [9 2; 6 5], [7 1; 8 4])

B = cat (3, [3 5; 0 1], [5 6; 2 1])

D = cat (4, A, B, cat (3, [1 2; 3 4], [4 3; 2 1])).

Функция cat автоматически добавляет, при необходимости, единичные индексы между размерностями. Например, для создания массива размера 2х2х1х2 можно ввести

C = cat (4, [1 2; 4 5], [7 8; 3 2])

 

В данном случае функция cat вводит нужное число единичных размерностей для создания четырехмерного массива, чья последняя размерность не является единичной. Если бы аргумент dim был бы равен 5, последняя запись привела бы к массиву размера 2х2х1х1х2. Это добавляет еще одну единицу в индексации массива. Для обращения к значению 8 в четырехмерном случае нужно применить следующую индексацию

Индекс единичной размерности

 

Определение характеристик многомерных массивов.

Для получения информации об имеющихся многомерных массивах можно воспользоваться стандартными командами size (дает размер массива), ndims (дает количество размерностей) и whos (последняя команда дает подробную информацию о всех переменных рабочего пространства системы MATLAB). Для вышеприведенного примера мы получим

size(C)

 

ans =

2 2 1 2

ndims(C)

ans =

4

 

Индексация

Многие концепции, используемые в двумерном случае, распространяются также на много-мерные массивы. Для выделения (обращения) к какому-либо одному элементу многомерного массива следует воспользоваться целочисленной индексацией. Каждый индекс указывает на соответствующую размерность: первый индекс на размерность строк, второй индекс на раз-мерность столбцов, третий на первую размерность страниц и так далее. Рассмотрим массив случайных целых чисел nddata размера 10х5х3:

nddata = fix (8*randn (10, 5, 3));

Для обращения к элементу (3,2) на странице 2 массива nddata нужно записать nddata(3,2,2).

Вы можете также использовать векторы как массив индексов. В этом случае каждый элемент вектора должен быть допустимым индексом, то есть должен быть в пределах границ, опре-деленных для размерностей массива. Так, для обращения к элементам (2,1), (2,3), и (2,4) на странице 3 массива nddata, можно записать

nddata (2, [1 3 4], 3).

 

Оператор двоеточия и индексирование многомерных массивов.

Стандартная индексация MATLAB-а при помощи оператора двоеточия (colon) применима и в случае многомерных массивов. Например, для выбора всего третьего столбца страницы 2 массива nddata используется запись nddata(:, 3, 2). Оператор двоеточия также полезен и для выделения определенных подмножеств данных. Так, ввод nddata(2:3,2:3,1) дает массив (мат-рицу) размера 2х2, который является подмножеством данных на странице 1 массива nddata. Эта матрица состоит из данных второй и третьей строки и сторого и третьего столбца первой стриницы многомерного массива. Оператор двоеточия может использоваться для индексации с обеих сторон записи. Например, для создания массива нулей размера 4х4 записываем:

C = zeros (4,4)

 

Теперь, чтобы присвоить значения подмножества 2х2 массива nddata четырем элементам в центре массива С запишем

C(2:3,2:3) = nddata (2:3,1:2,2)

 

Устранение неопределенностей в многомерной индексации

Некоторые выражения, такие как

A(:, :, 2) = 1:10

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

A(1,:,2) = 1:10.


Изменение формы (Reshaping)

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

 

B = reshape (A, [s1 s2 s3 ...] )

 

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

Функция reshape «действует» вдоль столбцов. Она создает преобразованную матрицу путем взятия последовательных элементов вдоль каждого столбца исходной матрицы.

Ниже в качестве примеров приведены несколько примеров массивов, которые могут быть получены из массива nddata (обратите внимание на размерности).

B = reshape(nddata,[6 25])

 

C = reshape(nddata,[5 3 10])

 

D = reshape(nddata,[5 3 2 5])


Удаление единичных размерностей.

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

B = repmat (5, [2 3 1 4] ) ;

size(B)

ans =

2 3 1 4

 

Функция squeeze удаляет единичные размерности из массива.

C = squeeze(B);

 

size(C)

ans =

 2  3  4

 

Функция squeeze не оказывает воздействия на двумерные массивы – векторы-строки оста-ются строками.

Вычисления с многомерными массивами

 

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

 

Действия над векторами

Функции которые действуют над векторами, такие как sum, mean, и т.д., по умолчанию обы-чно действуют вдоль первой неединичной размерности многомерного массива. Многие из этих функций дают возможность задать размерность вдоль которой они действуют. Однако, есть и исключения. Например, функция cross, которая определяет векторное произведение двух векторов, действует вдоль первой неединичной размерности, имеющей размер 3.

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

 

Поэлементное воздействие

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

 

Действия над плоскостями и матрицами

Функции, действующие над плоскостями или матрицами, такие как функции линейной алге-бры или матричные функции в директории matfun , не принимают в качестве аргументов многомерные массивы. Иными словами, вы не можете использовать функции в директории matfun, или операторы *, ^, \, или /, с многомерными массивами. Попытка использования многомерных массивов или операндов в таких случаях приводит к сообщению об ошибке.

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

A = cat (3 , [1 2 3; 9 8 7; 4 6 5], [0 3 2; 8 8 4; 5 3 5], [6 4 7; 6 8 5; 5 4 3]);

Применение функции eig ко всему многомерному массиву дает сообщение об ошибке:

eig(A)

??? Error using è eig

Input arguments must be 2-D.

 

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

eig(A(:, :, 2))

ans =

–2.6260

12.9129

2.7131

 

Внимание! В первом случае, где не используется оператор двоеточия, для избежания ошиб-ки нужно использовать функцию squeeze. Например, ввод eig (A(2,:,:)) приводит к ошибке так как размер входа есть [1 3 3]. Выражение eig(squeeze(A(2, :, :))), однако, передает функции eig допустимую двумерную матрицу.

 

Организация данных в многомерных массивах

Вы можете использовать два возможных варианта представления данных при помощи многомерных массивов:

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

В качестве конкретного примера рассмотрим представление какого-либо изображения в формате RGB. Напомним, что в формате RGB изображение хранится в виде трех двумерных матриц одинакового размера, каждая из которых характеризует интенсивность одного цвета – красного (Red), зеленого (Green) и синего (Blue) - в соответствующей точке. Общая карти-на при этом получается в результате наложения трех указанных матриц. Для отдельного изображения, использование многомерных массивов является, вероятно, наиболее легким путем для запоминания данных и доступа к ним.

Пусть все изображение хранится в файле RGB. Для доступа к полной плоскости изображе-ния в одном цвете, допустим – красном, следует записать

red_plane = RGB (:,:,1);

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

subimage = RGB (20:40, 50:85, :)

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

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

Здесь, чтобы найти среднее значение всех измерений, то есть среднюю температуру воздуха в комнате, можно записать

mean (mean (mean (TEMP)))

 

где через TEMP обозначен массив четырехмерных данных.

Дл получения вектора «серединных» температур (элемента (2,2)) комнаты на каждой странице, то есть в каждом сечении, запишем

B = TEMP (2, 2, :).


ОРГАНИЗАЦИЯ И ХРАНЕНИЕ ДАННЫХ


Для хранения различных типов данных в системе MATLAB используются так называемые структуры (structure) и ячейки (cell). Структуры (иногда их называют массивами структур) служат для хранения массивов различных типов данных, организаванных по принципу пои-менованных полей. Ячейки (или массивы ячеек) являются специальным классом массивов системы MATLAB, чьи элементы состоят из ячеек, в которых могут храниться любые другие массивы данных, применяемые в MATLAB-е. Как структуры, так и ячейки обеспечивают иерархический механизм для хранения самых различных типов данных. Они отличаются друг от друга прежде всего способом организации базы данных. При использовании струк-тур доступ к данным осуществляется при помощи наименований полей, тогда как в массивах ячеек доступ осуществляется при помощи матричной индексации.

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

Структуры

Функция

Описание

fieldnames

Получить имена полей

getfield

Получить содержание поля

isfield

Истинно, если поле есть в структуре

isstruct

Истинно, если структура

rmfield

Удалить поле

setfield

Установить содержимое поля

struct

Создать массив структур

struct2cell

Преобразовать структуру в массив ячеек

Ячейки

 

Функция

Описание

cell

Создать массив ячеек

cell2struct

Преобразовать массив ячеек в структуру

celldisp

Показать содержимое массива ячеек

cellfun

Применить функцию к массиву ячеек

cellplot

Показать графическую структуру массива ячеек

deal

Обмен данными между любыми классами массивов

iscell

Истинно для массивов ячеек

num2cell

Преобразовать числовой масси в массив ячеек

 

МАССИВЫ СТРУКТУР

 

Структуры это массивы данных с поименованными «хранилищами» данных, называемыми полями. Поля структуры могут содержать данные любого типа. Например, одно поле может содержать текстовую строку, представляющую имя (name), второе поле может содержать скалярную переменную, являющуюся счетом за лечение (billing), третье может содержать матрицу результатов медицинских анализов (test) и так далее.

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

 

Создание массивов структур

 

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

Путем использования операторов присваивания. С использованием функции struct.

 

Создание массивов структур с применением операторов присваивания.

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

patient.name = 'John Doe';

patient.billing = 127.00;

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

Если ввести теперь в командной строке запись

patient

 

то MATLAB ответит

name: 'John Doe'

billing: 127

test: [3x3 double]

 

patient является массивом, представляющим собой структуру с тремя полями. Для расшире-ния данного массива нужно просто добавить соответствующие индексы после имени струк-туры:

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

patient(2).billing = 28.50;

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

 

Структура patient имеет теперь размер [1 2]. Отметим, что если массив структур содержит более одного элемента, то MATLAB уже не выводит на экран содержание отдельных полей при вводе имени структуры. Взамен, на дисплей выдаются общая информация о содержимом структуры, то есть имена полей:

 

Patient

 

patient =

 

1x2 struct array with fields:

name

billing

test

 

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

Все структуры в массиве имеют одинаковое число полей. Все соответствующие поля имеют одинаковые имена.

Например, при вводе

patient(3).name = 'Alan Johnson'

структура patient принимает размер 1х3. При это оба поля patient(3).billing и patient(3).test содержат пустые матрицы.

Внимание! Размеры данных в одноименных полях могут быть различными. В нашем при-мере со структурой patient поля name могут иметь различную длину, поля test могут содер-жать массивы числовых данных различных размеров и так далее.

Создание массива структур с использованием функции struct.

Вы можете заранее создать массив структур применив функцию struct. Ее основная форма имеет вид

str_array = struct ('поле1',знач1,'поле2',знач2, ...)

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

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

и rainfall (дождевые осадки). Три различные способа задания такой структуры даны в приведенной ниже таблице.

Метод

Синтаксис

Задание

Функция struct

weather(3) = struct('temp',72,'rainfall',0.0);

 

Структура weather(3) инициализируется с указан-ными значениями полей. По-ля остальных двух структур в массиве, weather(1) и weather(2), содержат в качес-тве данных пустые матрицы.

Сочетание функций struct и repmat

weather =

repmat (struct ('temp', 72,

'rainfall', 0.0), 1, 3);

Все структуры в массиве weather инициализируются с использованием одинаковых значений одноименных полей.

Функция struct с использованием синтаксиса ячеек

weather =

struct ('temp',{68, 80, 72},

'rainfall', {0.2,0.4,0.0} );

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


Обращение к данным в массивах структур.

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

 

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

mypatients = patient(1:2)

 

1x2 struct array with fields:

name

billing

test

Первая структура в массиве mypatients совпадает с первой структурой в массиве patient:

mypatients(1)

 

ans =

 name: 'John Doe'

billing: 127

test: [3x3 double].

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

str = patient(2) . name

 

str =

Ann Lane

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

 

test2b = patient(3).test(2,2)

 

test2b =

153

Аналогичную форму записи следует использовать и для задания значений переменных внутри поля, например,

patient(3).test(2,2) = 7

 

Вы можете также одновременно извлечь данные одноименных полей многомерной структу-ры. Например, запись ниже создает вектор 1х3, содержащий все значения счетов полей billing fields.

bills = [patient.billing]

 

bills =

127.0000  28.5000  504.7000

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

tests = {patient(1:2).test}

 

tests =

[3x3 double] [3x3 double]


Обращение к полям структуры с применением функций setfield и getfield

Прямая индексация обычно является наиболее эффективным способом задания или получе-ния значений полей структуры. Если, однако, вы знаете только название поля в виде строки, например, если вы использовали функцию fieldnames для получения имени поля в пределах M-файла – то для указанных операций с данными этих полей можно также применить функ-ции setfield и getfield.

Функция getfield позволяет получить значение или значения поля или элемента поля и име-ет следующий синтаксис

f = getfield(array,{array_index},'field',{field_index})

где индекс field_index является необязательным , а array_index является необязательным для массива структур размера 1х1. Данный синтаксис соответствует записи

f = array(array_index).field(field_index)

Например, для обращения к полю name во второй структуре массива patient запишем

str = getfield(patient,{2},'name')

Аналогично, функция setfield дает возможность задать значения полей используя синтаксис

f = setfield (array,{array_index},'field',{field_index},value)

 

Определение размера массива структур

Для получения размера массива структур или размера любого поля структуры. можно вос-пользоваться функцией size. При вводе в качестве аргумента функции size имени структуры, данная функция возвращает вектор размерностей массива. Если задать аргумент в форме массив(n).поле, функция size возвращает размер содержимого поля. Например, для нашей структуры patient размера 1х3, запись size(patient) возвращает вектор [1 3]. Выражение size(patient(1,2).name) возвращает длину строки имени элемента (1,2) структуры patient.

 

Добавление полей к структуре

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

patient(2).ssn = '000–00–0000'

 

При этом поле patient(2).ssn второго пациекта имеет заданное значение. Все другие структу-ры в массиве структур также имеют поле ssn, но эти поля содержат пустые матрицы до тех пор, пока вы не зададите в явном виде соответствующие значения.

Удаление поля из структуры

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

struc2 = rmfield(array,'field')

 

где array это массив структур, а 'field' является именем поля, которое вы хотите удалить. Например, чтобы удалить поле name из массива patient, нужно ввести:

patient = rmfield(patient,'name')


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

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

mean((patient(2).test)')

 

Зачастую бывают различные возможности для применеия функций или операторов к полям массива структур. Один из путей суммирования всех полей billing в структуре patient выг-лядит следующим образом:

total = 0;

for j = 1:length(patient)

total = total + patient(j).billing;

end

 

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

 

total = sum ([patient.billing])

 

Подобная запись эквивалентна использованию так называемого списка, разделенного запятой (comma-separated list)

total = sum ([patient(1).billing , patient(2).billing ,...])

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

Создание функций для операций над массивами структур

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

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

Приведенная ниже функция concen, действует над массивом структур со специфичными ха-рактеристиками. Их характеристики должны содержать поля lead (свинец), mercury (ртуть),

и chromium (хром).

function [r1, r2] = concen(toxtest);

% Create two vectors. r1 contains the ratio of mercury to lead

% at each observation. r2 contains the ratio of lead to chromium.

r1 = [toxtest.mercury]./[toxtest.lead];

r2 = [toxtest.lead]./[toxtest.chromium];

% Plot the concentrations of lead, mercury, and chromium

% on the same plot, using different colors for each.

lead = [toxtest.lead];

mercury = [toxtest.mercury];

chromium = [toxtest.chromium];

plot(lead,'r'); hold on

plot(mercury,'b')

plot(chromium,'y'); hold off

 

Данная функция создает два вектора. r1 содержит отношение ртути к свинцу в каждом наб-людении, а r2 содержит отношение свинца к хрому. Далее эта функция строит кривые кон-центрации свинца, ртути и хрома на одном графике, используя разные цвета (красный – сви-нец, синий – ртуть, желтый – хром).

Попробуйте применить данную функцию на примеры структуры test со следующими данны-ми

test(1).lead = .007; test(2).lead = .031; test(3).lead = .019;

test(1).mercury = .0021; test(2).mercury = .0009;

test(3).mercury = .0013;

test(1).chromium = .025; test(2).chromium = .017;

test(3).chromium = .10;

 

Организация данных в массиве структур

Ключ к организации массива структур состоит в выборе способа, которым вы хотите обра-щаться к подмассивам данных или отдельным данным структуры. Это, в свою очередь, оп-ределяет как вы дольжны построить массив, содержащий структуры и как выбирать поля структуры. Например, рассмотрим RGB изображение размера 128х128, запомненное в трех различных массивах : RED, GREEN и BLUE.

 

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

тур.

Плоская организация Поэлементная организация

Плоская организация

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

A.r = RED;

A.g = GREEN;

A.b = BLUE;

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

red_plane = A.r;

 

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

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

 

red_sub = A.r (2:12, 13:30);

grn_sub = A.g (2:12, 13:30);

 blue_sub = A.b (2:12, 13:30);


Поэлементная организация

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

for i = 1:size(RED,1)

for j = 1:size(RED,2)

B(i,j) .r = RED(i,j);

B(i,j) .g = GREEN(i,j);

B(i,j) .b = BLUE(i,j);

end

end

 

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

Bsub = B(1:10, 1:10);

Однако, обращение к полной плоскости изображения при поэлементом методе требуется цикл :

red_plane = zeros(128,128);

for i = 1 : (128*128)

red_plane(i) = B(i).r;

end

 

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

Пример - Простая база данных

 

Рассмотрим организацию простой базы данных.

 А Плоская организация В Поэлементная организация

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

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

а) При плоской организации

 

avg = mean(A.amount);

 

б) При поэлементной организации

avg = mean([B.amount]);

Поэлементная организация дает более легкий доступ ко всей информации, связанной с одним клиентом. Рассмотрим М-файл, названный client.m, который осуществляет вывод на экран имени и адреса любого клиента. При использовании плоской организации, следует вводить в качестве аргументов индивидуальные поля:

function client(name,address, amount)

disp(name)

disp(address)

disp(amount)

Для вызова функции client для второго клиента записываем,

client(A.name(2,:),A.address(2,:), A. amount (2,:))

 

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

function client(B)

disp(B)

Для вызова функции client для второго клиента при этом просто записываем,

client(B(2))

 

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

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

Вложенные структуры

 

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

Создание вложенных структур при помощи функции struct

Для создания вложенных структур вы можете применить функцию struct . Например, создадим массив структур размера 1х1 со вложенной в поле nest структурой:

A = struct('data',[3 4 7; 8 0 1],'nest',struct('testnum','Test 1', 'xdata',[4 2 8],'ydata',[7 1 6]));

 

Применим теперь операторы присваивания для добавления сторого элемента к массиву А:

A(2).data = [9 3 2; 7 6 5];

A(2).nest.testnum = 'Test 2';

A(2).nest.xdata = [3 4 2];

A(2).nest.ydata = [5 0 9];

 


Индексация вложенных структур

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

Для обращения к вложенной структуре внутри А(1) запишем A(1).nest. Для обращения к полю xdata во вложенной структуре в A(2) запишем A(2).nest.xdata. Для обращения к элементу 2 поля ydata в A(1), запишем A(1).nest.ydata(2).

МАССИВЫ ЯЧЕЕК

 

Массивы ячеек это массивы данных системы MATLAB элементы которых являются ячейка-ми и могут служить «хранилищами» для других массивов данных. Например, одна ячейка массива ячеек может содержать матрицу действительных чисел, другая ячейка – массив тек-стовых строк, а третья – вектор комплексных значений.

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

Создание массивов ячеек

Вы можете создавать массивы ячеек двумя способами:

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

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

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

Индексация ячеек

Заключите индексы ячейки в обычные скобки с использованием стандартной индексации массивов. Заключите содержимое ячейки в правой стороне оператора присваивания в фигур-ные скобки “{}”. Например, создадим массив ячеек А размера 2х2.

A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};

 A(1,2) = {'Anne Smith'};

A(2,1) = {3+7i};

A(2,2) = {–pi:pi/10:pi};

 

Внимание! Запись “{}” обозначает пустой массив ячеек, точно так же как “[ ]” обозначает пустую матрицу для числовых массивов. Вы можете использовать пустой массив ячеек в лю-бых выражениях с массивами ячеек.

 

Индексация содержимого ячеек

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

A{1,1} = [1 4 3; 0 5 8; 7 2 9];

A{1,2} = 'Anne Smith';

A{2,1} = 3+7i;

A{2,2} = –pi:pi/10:pi;

 

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

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

MATLAB выводит содержимое массива ячеек на дисплей в сжатой форме. Для нашего мас-сива А мы получим.

A =

[3x3 double] 'Anne Smith'

[3.0000+ 7.0000i] [1x21 double]

Для вывода полного содержания ячеек, нужно воспользоваться функцией celldisp. Для гра-фического вывода на дисплей архитектуры ячейки служит функция cellplot. Если вы назна-чаете данные ячейке, которая находится вне размерности имеющегося массива ячеек, MATLAB автоматически расширяет массив, чтобы включить заданный вами элемент. При этом промежуточные ячейки заполняются пустыми матрицами. Например, приведенный ни-же оператор присваивания превращает массив ячеек А размера 2х2 в массив размера 3х3.

 

A(3,3) = {5};

 

Все остальные ячейки третьего столбца и третьей строки при этом будут содержать пустые матрицы.

 

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

Фигурные скобки, “{}”, являются такими же конструктурами массивов ячеек, как квадрат-ные скобки являются конструкторами числовых массивов. Фигурные скобки используются совершенно аналогично квадратным скобкам, за тем исключением, что их можно использо-вать для вложения массивов ячеек (см. ниже).

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

C = {[1 2], [3 4]; [5 6], [7 8]};

 

приводит к следующему массиву ячеек размера 2х2

Для объединения отдельных массивов ячеек в новые массивы, вы можете использовать квадратные скобки, как и при объединении числовых массивов.

Задание массивов ячеек при помощи функции cell

Функция cell позволяет создавать пустые массивы ячеек заданного размера. Например, сле-дующее выражение создает пустоймассив ячеек размера 2х2.

 

B = cell(2, 3);

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

B(1,3) = {1:3};

 

Доступ к данным массивов ячеек

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

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

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

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

 

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

N{1,2} = 'Name';

N{2,1} = 2 – 4i;

N{2,2} = 7;

 

Вы можете получить строку в N{1,2} записав

c = N{1,2}

 

При вводе данной строки MATLAB выдаст

c =

Name

 

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

 A{1, :} = value и B = A{1, :} являются неправильными.

Для обращения к подмножествам содержимого одной ячейки нужно объединить индексиро-вание. Например, чтобы получить элемент (2,2) массива в ячейке N{1,1}, следует записать:

 

d = N{1,1} (2,2)

 

что даст

d =

5


Обращение к подмножествам массива ячеек

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

 

Удаление ячеек

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

.

A(:, 2) = [ ]

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

 

Изменение формы (размерностей) массива ячеек

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

A = cell(3, 4);

size(A)

 ans =

3 4

 

B = reshape(A,6,2);

size(B)

ans =

6 2


Замена списка переменных массивами ячеек

Массивы ячеек могут быть ипользованы для замены списка переменных MATLAB-а в сле-дующих случаях:

В списке входных аргументов. В списке выходных переменных. В операциях отображения на дисплей. При конструировании массивов (квадоатные скобки и фигурные скобки).

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

[ T{1} , T{2} , T{3} , T{4} , T{5} ]

Рассмотрим массив ячеек C:

C(1) = {[1 2 3]};

C(2) = {[1 0 1]};

 C(3) = {1:10};

C(4) = {[9 8 7]};

C(5) = {3};

Для свертки векторов в C(1) и C(2) с использованием функции conv, нужно записать

d = conv(C{1:2})

 

d =

1 2 4 2 3

Для вывода на дисплей векторов со второго по четвертый введем

C{2:4}

Это даст

ans =

1 0 1

 

ans =

1 2 3 4 5 6 7 8 9 10

 

ans =

9 8 7

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

B = [ C{1}; C{2}; C{4} ]

что приводит к

B =

1 2 3

1 0 1

9 8 7

 

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

[D{1:2}] = eig (B)

 

D =

[3x3 double] [3x3 double]

 

Напомним, что при задании двух выходных аргументов, выходом функции eig(B) является модальная матрица, составленная из нормированных собственных векторов матрицы B и ди-агональная матрица собственных значений. Вы можете вывести в командное окно действи-тельные значения собственных векторов и значений вводя D{1} и D{2}.

 

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

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

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

A{1, 2} = randn (3,3);

A{1, 3} = 1 : 5;

Тогда, для применения функции sum к содержимому первой ячейки массива запишем

B = sum (A{1,1})

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

B =

4 6

Для применения той же функции к нескольким ячейкам не вложенных массивов ячеек, нуж-но применить цикл:

for i = 1:length(A)

M{i} = sum(A{1,i});

end


Организация данных в массивах ячеек

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

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

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

Массива размера 3х3, состоящего из измерений, полученных экспериментально. Строки из 15 символов, содержащей имя инженера. Массива размера 3х4х5, содержащего записи измерений за последние 5 эксперимен-тов.

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

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

[newdata, name] = deal (TEST{1:2})

а следующий пример демонстрирует то же при организации данных в виде структуры с тем же именем TEST:

newdata = TEST.measure

name = TEST.name

Вложение массивов ячеек

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

 

Создание вложенных массивов при помощи вложенных фигурных скобок

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

clear A

A(1,1) = {magic(5)};

A(1,2) = { { [ 5 2 8; 7 3 0; 6 7 3] 'Test 1'; [2 – 4i 5 + 7i] {17 [ ] } } }

что даст

A =

[5x5 double] {2x2 cell}

Отметим, что правая часть второго оператора присваивания заключена в две пары фигурных скобок. Первая пара характеризует ячейку cell (1,2) массива ячеек A. Второй “набор” скобок представляет массив ячеек размера 2х2 внутри внешней ячейки.

Создание вложенных массивов при помощи функции cell

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

1. Создадим пустой массив размера 1х2

A = cell (1, 2);

 

2. Создадим массив ячеек размера 2х2 внутри A(1,2).

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

 

3. Заполним массив А, используя выражения

 

A(1,1) = {magic(5)};

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.

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

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

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

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

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

М-сценарии

М-функции

Не допускают входных и выходных переменных Допускают входные и выходные аргументы
Оперируют в данными из рабочей области Внутренние переменные по умолчанию являются локальными по отношению к функциям
Предназначены для автоматизации последовательности шагов, которые нужно выполнять много раз Предназначены для расширения возможностей языка 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 сталкивается с новым именем, он осуществляет следующую последователь-ность шагов:

Проверяет, не является ли имя переменной. Проверяет, не является ли имя подпрограммой (subfunction), то есть функцией MATLAB–а, которая находится в пределах того же М-файла, что и вызываемая функ-ция. Проверяет, не является ли имя частной функцией (private function), то есть функцией, которая находится в специальной директории под названием Private (private directo-ry) , то есть директории доступной только для М-файлов в пределах той же директо-рии где она сама находится. Проверяет, находится ли данная на пути доступа 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.

function [varargout] = testvar2 (arrayin)

for i = 1:nargout

varargout {i} = arrayin (i, :)

end

Оператор присваивания в цикле for использует синтаксис индексации массивов ячеек. Вот пример применения функции testvar2:

 a = {1 2; 3 4 ; 5 6 ; 7 8; 9 0};

[p1, p2, p3, p4, p5] = testvar2 (a);


Место функций varargin и varargout в списке аргументов

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

 

function [out1,out2] = example1(a,b,varargin)

function [i,j,varargout] = example2(x1,y1,x2,y2,flag)

 

Локальные и глобальные переменные

Каждая исполняемая функция MATLAB-а, определенная некоторым М-файлом, имеет свои собственные локальные переменные расположенные в своем рабочем пространстве, которые отделены от локальных переменных других функций и переменных в основном рабочем про-странстве. Однако, если несколько функций и, возможно, основное рабочее пространство, объявляют некоторую конкретную переменную глобальной, то все эти функции и основное рабочее пространство будут иметь доступ к данной переменной. Любое изменение глобаль-ной переменной, произведенное в пространстве какой-либо одной функции, немедленно воспринимается всеми остальными функциями, где эта переменная объявлена глобальной. Допустим, вы хотите изучить эффект изменения коэффициентов взаимосвязей a и  b, в диф-ференциальном уравнении Лотки-Вольтера (Lotka-Volterra), известного как модель хищника-жертвы.

dy1/dt = y1 - ay1y2

dy2/dt = y2 - by1y2

Создадим М-файл lotka.m.

function yp = lotka(t,y)

global ALPHA BETA

yp = [y(1) – ALPHA*y(1)*y(2); –y(2) + BETA*y(1)*y(2)];

Затем введем последовательно в командное окно следующие выражения

global ALPHA BETA

 ALPHA = 0.01

BETA = 0.02

[t,y] = ode23('lotka',0,10,[1; 1]);

plot(t,y)

 

Объявление переменных ALPHA и BETA глобальными в командной строке позволяет ме-нять соответствующие значения внутри функции заданной файлом lotka.m. Интерактивное изменение данных переменных в командном окне приводит к получению новых решений без каких-либо редактирований текста файла.

Для работы в ваших приложениях с глобальными переменными следует:

q  Объявить соответствующую переменную глобальной в каждой функции, где пре-дусмотрено ее использование. Для обеспечения доступа к глобальной переменной из командного окна нужно объявить данную переменную глобальной также и в командной строке.

q  В каждой функции объявите переменную глобальной до первого появления ее имени в тексте файла. Обычно рекомендуется объявлять переменные глобальными в начале М-файла.

Глобальные переменные в MATLAB-е обычно имеет более длинные имена и иногда записы-ваются заглавными буквами.Это не является настоятельным требованием, но упрощает чте-ние файлов и уменьшает риск случайного изменения глобальной переменной.

Перманентные переменные (Persistent Variables)

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

Для работы с перманентными переменными в MATLAB-е предусмотрены три функции:

Функция

Описание

mlock

Исключает возможность удаления М-файла из памяти

munlock

Возвращает М-файлу возможность его удаления из памяти

mislocked

Указывает, может ли М-файл быть удален из памяти

Специальные переменные

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

Функция

Возвращаемое значение

ans

Последний ответ (переменная). Если вы не присваиваете выходной переменной или вычисляемому выражению какое-либо имя, MATLAB автоматически запоминает результат в переменной ans.

eps

Относительная точность вычислений с плавающей запятой. Это допуск, который MATLAB использует при вычислениях.

realmax

Наибольшее число с плавающей запятой.

realmin

Наименьшее число с плавающей запятой.

pi

3.1415926535897...

i, j

Мнимая единица.

inf

Бесконечность. Вычисления вида n/0 где n – любое ненулевое реально число, дает в результате inf.

NaN

Не численное значение (Not-a-Number). Выражения вида 0/0 и

inf/inf дают в результате NaN, так же как и арифметические операции содержащие NaN. Выражения типа n/0, где n явля- ется комплексным числом, также возвращают NaN.

computer

Тип компьютера.

version

Строка, содержащая версию MATLAB-а.

Вот несколько примеров, где используются эти переменные.

x = 2*pi;

A = [3 + 2i 7 – 8i];

tol = 3*eps;


Типы данных

 

Всего в MATLAB –е имеется 14 базовых типов (или классов) даных. Каждый из этих типов данных является формой массива. Этот массив может иметь минимальный размер 0х0 и мо-жет иметь произвольную размерность по любой координате. Двумерные варианты таких массивов называются матрицами.Все 14 базовых класса типов данных показаны на приве-денной ниже диаграмме. Дополнительно, тип данных, определенных пользователем, пока-занный ниже как user class (класс пользователя), является подмножеством данных типа структуры.

Тип данных char содержит символы данные в коде Unicode. Строка символов является про-сто массивом символов размера 1хn. array of characters. Вы можете использовать тип данных char для хранения массивов строк, при условии, что все строки массива имеют одинаковую длину (это является следствием того, что все массивы MATLAB-а должны быть прямоуголь-ными). Для хранения массива строк разной длины нужно использовать массив ячеек.

Числовые типы данных включают целые числа со знаком и без знака, числа в формате пла-вающей запятой одинарной и двойной точности, и разреженные массивы (sparse arrays) двойной точности.

Сказанное ниже сохраняется в силе для всех типов числовых данных в MATLAB-е:

q  Все вычисления в MATLAB-е выполняются с двойной точностью.

q  Целые числа и числа одинарной точности обеспечивают более эффективное использование памяти по сравнению с числами двойной точности.

q  Все типы данных поддерживают базовые операции над массивами, такие как исполь-зование индексов и измерение размеров массива.

q  Для выполнения математических операций над целыми числами или массивами с оди-нарной точностью представления, вы должны первратить их в массивы с двойной точ-ностью при помощи функции double.

Операторы

Операторы системы MATLAB делятся на три категории:

q  Арифметические опреаторы, осуществляющие численные вычисления.

q  Операции отношения, которые осуществляют численное сравнение операндов.

q  Логические операторы, включающие AND (логическое И), OR (логическое ИЛИ), и NOT (логическое отрицание НЕ).

Арифметческие операторы

MATLAB обеспечивает следующие арифметические операторы

Операторы Описание

+

Сложение
- Вычитание
.* Умножение
./ Правое деление
.\ Левое деление
+ Унарный плюс (изменение знака объекта)
- Унарный минус
: Оператор двоеточия
.^ Степень
.’ Транспонирование
Комплексно-сопряженное транспонирование
* Матричное умнжение
/ Матричное правое деление
\ Матричное левое деление
^ Степень матрицы

Арифметические операторы и массивы

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

Следующий пример иллюстрирует свойство скалярного расширения при вычислении произ-ведения скалярного опренда и матрицы

A = magic(3)

 

A =

8 1 6

3 5 7

4 9 2

 

Введем

3 * A

что дает

ans =

 24 3 18

9 15 21

12 27 6

 

Операторы отношения

MATLAB обеспечивает следующие операторы отношения

Операторы Описание
Меньше чем
<= Меньше чем или равно
Больше чем
>= Больше чем или равно
== Равно
~= Не равно

 

Операторы отношения и массивы

Операторы отношения в MATLAB-е сравнивают соответствующие элементы двух массивов с одинаковыми размерностями. Эти операторы всегда действуют поэлементно. В приведен-ном ниже примере, результирующая матрица показывает, где элемент матрицы A равен со-ответствующему элементу матрицы B.

A = [2 7 6; 9 0 5; 3 0.5 6];

B = [8 7 0; 3 2 5; 4 –1 7];

 

A == B

ans =

0 1 0

0 0 1

0  0  0

Для векторов и прямоугольных массивов, оба операнда должны иметь одинаковый размер или один из них должен быть скаляром. В случае когда один операнд является скаляром, а второй – нет , MATLAB проверяет данный скаляр с каждым элементом другого операнда. Те положение, где заданное отношение является истинным, принимают значение 1. Положение, где отношение является ложным, принимают значение 0.

 

Операторы отношения и пустые массивы

Операторы отношения работают и с массивами, у которых какая-либо размерность равна ну-лю (что приводит к пустому массиву), если оба массива имеют одинаковый размер или же один из них является скаляром. Однако, выражения вида

A == [ ]

приводят к ошибке, если только массив А не имеет размеры 0х0 или 1х1. Для проверки явля-ется ли данный массив пустым, следует использовать специальную функцию isempty(A).


Логические операторы

MATLAB обеспечивает следующие логические операторы

Оператор Описание
& AND (логическое И)
| OR (логическое ИЛИ)
~ NOT (логическое НЕ)

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

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

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

u = [1 0 2 3 0 5];

v = [5 6 1 0 0 7];

u & v

ans =

0 0 1 0 0 1

 

q  Выражения, использующие оператор ИЛИ ( | ), являются истинными если один из операндов является истинным. Выражения с ИЛИ являются ложными только если ло-жными являются оба операнда. При численных элементах, выражение является лож-ным, елси только оба операнда равны нулю. Для приведенных выше векторов u и v имеем

u | v

 ans =

1     1 1 1 0 1

 

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

 

~u

ans =

0 1 0 0 1 0

 

Использованием логических операторов с массивами

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

Логические функции

В дополнение к логическим операторам, MATLAB имеет ряд логических функций.

Функция Описание Примеры

xor

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

a = 1; b = 1;

xor(a,b)

ans =

0

all

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

A = [0 1 2; 3 5 0]

A =

0 1 2

3 5 0

all(A)

ans =

0 1 0

any

Возвращает единицу, если любой из аргументов является истинным или ненулевым; в против-ном случае вовращает 0. Как и all , any работает вдоль столбцов матриц.

v = [5  0  8];

any(v)

ans =

1

Ряд других функций MATLAB-а выполняет логические операции. Например, функция isnan возвращает 1 для NaN; функция isinf возвращает 1 для Inf. Более подробный список можно найти в директории ops.

Логические выражения использующие функцию find

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

 

A = magic(4)

 

A =

16  2  3  13

5  11 10  8

9 7 6 12

4  14 15 1

 

i = find (A > 8);

A(i) = 100

 

A =

100 2 3 100

5 100 100 8

100 7 6 100

4 100 100 1

 

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

 

Приоритеты операторов

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

Обычные скобки (). Транспонирование (.'), степень (.^), комплексно-сопряженное транспонирование('), степень матрицы(^). Унарный плюс (+), унарный минус (-), логическое отрицание (~). Умножение (.*), правое деление (./), левое деление(.\), матричное умножение (*), матричное правое деление (/), матричное левое деление (\). Сложение (+), вычитание (-). Оператор двоеточия (:). Меньше чем (<), меньше чем или равно (<=), больше чем (>), больше чем или равно (>=), равно (==), не равно (~=). Логическое И (&). Логическое ИЛИ (|).

Изменение приоритетов операторов

Имеющаяся последовательность приоритетов может быть изменена путем использования обычных скобок, как это показано в следующем примере.

A = [3 9 5];

B = [2 1 5];

 

C = A ./ B.^2

C =

0.7500 9.0000 0.2000

C = (A. / B) .^2

C =

2.2500  81.0000 1.0000

Выражения могут также содержать переменные, заданные посредством индексов

b = sqrt (A(2)) + 2*B(1)

 

b =

7

Команды управления данными (Flow Control)

 

В MATLAB-е имеются 8 базовых команд для управления потоками данных:

• if, совместно с else и elseif, осуществляет обработку группы выражений, основываясь на

некотором логическом условии.

• switch, совместно с case и otherwise, обрабатывает различные группы выражений, основы-

ваясь на значении некоторого логического условия.

• while осуществляет обработки группы выражений неопределенное число раз, основываясь

на некотором логическом условии.

• for осуществляет обработку группы выражений определенное (заданное) число раз.

• continue передает управление к следующей итерации в циклах for или while , пропуская

все оставшиеся выражения в теле цикла.

• break прекращает обработку выражений и выходит из циклов, созданных командами for

или while.

• try...catch изменяет последовательность выполнения команд, если во время выполнения

программы получено сообщение об ошибке.

• return приводит к прекращению выполнения данной программы и к возврату в вызываю-

щую функцию.

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

 Внимание! Во многих случаях вы можете ускорить выполнение программ MATLAB-а, путем замены циклов с командами for и while векторными выражениями (см. ниже).

Команды if, else, and elseif

Команда if оценивает логическое выражение и обрабатывает группу операторов, основыва-ясь на значении указанного выражения. В свое простейшей форме синтаксис команды имеет вид

if (логическое выражение)logical_expression

операторы

end

Если логическое выражение истинно, то есть равно 1, MATLAB выполняет все операторы между строками, содержащими команды if и end . После этого он продолжает выполнять ко-манды. находящиеся за строкой с end. Если логическое выражение ложно, то есть дает логи-ческий 0, MATLAB перескакивает через все выражения между строками с if и end , и про-должает свою работу со строки, следующей за командой end. Например,

if rem (a,2) == 0

disp('a is even')

b = a/2;

end

 

Данный блок проверяет, является ли входной аргумент четным числом и, если да, то выводит в комндную строку соответствующее сообщение и делить число а пополам. В противном случае, данный блок не выполняется. Между строками с if и end вы можете включить произ-вольное число операторов, содержащих, в свою очередь, любые команды и циклы. Если ло-гическое выражение приводит к нескалярной величине, то для выполнения блока все элемен-ты аргумента должны буть ненулевыми. Например, допустим X является матрицей. Тогда выражение

if X

операторы

end

эквивалентно следующему

if all(X(:))

операторы

end

При использовании с if , команды else и elseif дают следующие дополнительные возможно-сти создания программ:

• Команда else не имеет логического условия. Операторы, связанные с данной командой вы-

полняются, если предшествующее условие команды if (и, возможно, elseif) является лож-

ным.

• Команда elseif имеет логическое условие, которое оценивается, если предшествующее ус-

ловие команды if (и, возможно, elseif), является ложным. Если логическое условие данной

команды elseif является истинным, то выполняются соответствующие операторы, следую-

щие за данной командой. Вы можете иметь произвольное число команд elseif в пределах

одного блока с if.

 

if n < 0 % Если n отрицательно, дать сообщение об ошибке

disp('Input must be positive');

elseif rem (n, 2) == 0 % Если n положительно и четно, разделить на 2.

A = n/2;

else

A = (n+1) /2; % Если n положительно и нечетно, прибавить 1 и

% разделить на два.

end

 

Команда if и пустые массивы

Если логическое условие, связанное с if, приводит к нулевому массиву, то оно оценивается как ложное. Например, если А является пустым массивом, то следующий блок

if A

S1

else

S0

end

выполняет оператор S0.

 

Команда switch

Команда switch осуществляет обработку определенных операторов, исходя из значения пере-менной или выражения. Ее базовая форма имеет вид

switch выражение (скаляр или строка символов)

case значение 1

операторы % Выполняются если выражение == значение 1

case значение 2

операторы % Выполняются если выражение == значение 2

.

.

.

otherwise

операторы % Выполняются если выражение не соответствует не одному

% значению, связанному с командами case

end

Данный блок состоит из:

• Слова switch за которым следует выражение которое нужно оценить..

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

otherwise. Отметим, что всегда выполняется только первый подходящий блок с case.

• Не обязательной группы операторов, начинающихся словом otherwise; эта группа обраба-тывается, если значение выражения не было перехвачено каким-либо предшествующим бло-ком с case. Обработка группы операторов за словом otherwise прекращается на команде end.

• Заключительной команды end.

Блок с командой switch работает путем сравнения входного выражения, которе может быть численным скаляром или строкой символов, с каждым значением ключей case. В случае чис-ленных выражений выполняется какой-либо (первый) блок, если справедливо логическое ра-венство значение == выражение. При выражениях в виде строки символов, блок выполня-ется, если истинно выражение strcmp(значение,выражение) (команда strcmp осуществляет логическое сравнение строк символов) .

Приведенный ниже код дает простой пример использования команды switch. Он проверяет переменную input_num и сравнивает ее с заданными числами. Если значения input_num равны –1, 0, или 1, команды case производят вывод значений на экран в виде текста. Если переменная input_num не равна не одному из указанных значений, выполнение переходит к строке otherwise и программа выводит на экран текст 'other value' («другое значение»).

switch input_num

 case –1

disp('negative one');

case 0

 disp('zero');

case 1

disp('positive one');

otherwise

 disp('other value');

end

 

Внимание ! В отличие от соответствующих операторов языка C, оператор switch в MATLAB-е «доходит» только до первого оператора case, который удовлетворяет заданному входному выражению; остальные операторы case при этом не проверяются.

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

switch var

case 1

 disp('1')

case {2,3,4}

disp('2 or 3 or 4')

case 5

disp('5')

otherwise

disp('something else')

 end

 

Команда while

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

while expression

statements

end

Если логическое выражение expression имеет матричный вид, то для продолжения выполне-ния цикла все его элементы должны быть истинными, то есть равны логической единице. Чтобы привести матричное условие к скалярному, следует воспользоваться функциями all и any. Например, следующий цикл находит первое целое число n, для которого факториал n! является 100-значным числом

n = 1;

 while prod(1:n) < 1e100

n = n + 1;

end

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

Команда while и пустые массивы

Если условие при while сводится к пустому массиву, то оно соответствует ложному выраже-нию, то есть последовательность команд

while A

S1;

 end

никогда не выполнит оператор S1 если A есть пустой массив.


Команда for

Цикл с командой for обрабатывает оператор или группу опреаторов заранее заданное число раз. Ее синтаксис имеет вид

for index = start:increment:end

statements

 end

где index – является изменяемым целочисленным индексом с начальным и конечным значе-ниями start и end и приращением increment. По умолчанию, приращение равно 1, но вы мо-жете задать любое приращение, включая и отрицательное. При положительных индексах, выполнение прекращается когда значение индекса превышает конечное значение end; при отрицательных приращениях выполнение прекращается когда индекс становится меньше конечного значения.

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

 

 for i = 2:6

x(i) = 2*x (i–1);

end

Вы можете использовать вложенные циклы с комндой for:

 for i = 1:m

for j = 1:n

A (i, j) = 1/(i + j – 1) ;

end

end

 

Внимание ! Вы можете зачастую ускорить выполнение кодов в MATLAB-е путем замены циклов с for и while векторизованными кодами (см. ниже).


Использование в качестве индексов массивов

Индексы команды for могут быть массивом значений. Например, рассмотрим массив А раз-мера m х n . Выражение

for i = A

 statements

end

 

приравнивает индекс I вектору A(: , k). При первой итерации значение k равно 1; при второй итерации k равно 2 , и так до тех пор, пока k не становится равным n. Иными словами, цикл повторяется n раз, где n есть число столбцов в A. При этом, при каждой итерации индекс i является вектром, содержащим один из столбцов матрицы A.


Команда continue

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


Команда break

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

 

Команды try ... catch

Общая форма последовательности команд try ... catch имеет вид

try

statement,

...,

 statement,

catch,

statement,

...,

statement,

end

 

В данной последовательности выполняются операторы между командами try и catch до тех пор, пока не происходи какая-либо ошибка вычислений. Тогда управление передается («пе-рехватывается») последовательносью операторов между командами catch и end. Для того чтобы узнать причину, приведшую к ошибке, можно воспользоваться комндой lasterr (пос-ледняя ошибка). Если ошибка случается между командами catch и end, то MATLAB прек-ращает вычисления, если только между предыдущими командами catch и end не установле-на другая последовательность команд try ... catch.


Команда return

Команда return прекращает выполнение текущей последвательности команд и возвращает управление в вызывающую функцию (то есть «родительскую» функцию, из которой была вызвана текущая функция) или же возвращает управление к клавиатуре. Команда return так-же приводит к окончанию режима keyboard (последняя команда, когда встречается в теле программы, передает управление клавиатуре; она часто используется при отладке програм-мы). При обычных условиях работы вызванная функция передает управление в вызываю-щую функцию когда первая выполнена полностью, то есть до конца. Команда return может быть включена в тело вызываемой функции для того чтобы прекратить ее исполнение при выполнении определенных условий.

 

Подфункции

 

М-функции могут содержать коды более чем одной функции. Первая функция в файле являе-тся главной функцией (primary function), которая имеет имя самого М-файла. Дополнитель-ные функции  в пределах данного файла являются подфункциями (subfunctions), которые «ви-дны» (то есть могут быть вызваны) только для главной функции или других подфункций то-го же файла. Каждая подфункция начинается со своей линии определения. Все подфункции следуют непосредственно друг за другом. Порядок следования различных подфункций не имеет никакого значения, при этом главная функция должна быть обязательно записана пер-вой. Например,

function [avg,med] = newstats(u)  % Главная функция

% NEWSTATS Находит среднее значение и медиану при помощи внутренних

 % подфункций.

n = length(u);

avg = mean(u,n);

med = median(u,n);

function a = mean(v,n) % Подфункция

% Находит среднее значение.

a = sum(v)/n;

function m = median(v,n) % Подфункция

% Находит медиану.

w = sort(v);

if rem(n,2) == 1

m = w((n+1)/2);

else

m = (w(n/2)+w(n/2+1))/2;

end

 

Подфункции mean и median вычисляют среднее значение и медиану входных данных. Глав-ная функция newstats находит длину входного вектора данных и вызывает подфункции, пе-редавая им данные длины n. Функции в пределах одного и того же файла не имеют общего доступа к каким-либо переменным, если только вы не объявите эти переменные глобальными или же не передадите их в виде аргументов в соответствующие подфункции, как это реализовано в приведенном выше примере. Кроме того, все средства помощи («help») име-ют доступ только к главной функции в М-файле. Когда вы вызываете какую-либо функцию из М-файла, MATLAB прежде всего проверяет, не является ли данная функция подфункци-ей. Затем проверяется, не является ли данная функция частной функцией (private function), описанной в следующем разделе, и далее ищутся стандартные М-файлы на путях доступа

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

 

Частные функции

Частные функции являются функциями, которые находятся в подкаталоге со специальным именем private (частный). Они видны, то есть могут быть вызваны, только из функций в пре-делах родительского каталога. Например, допустим, что каталог newmath находится на пу-тях доступа MATLAB-а. Подкаталог в данной директории newmath, названный private, со-держит только функции, которые могут быть вызваны из каталога newmath. Поскольку ча-стные функции являются невидимыми вне пределов родительского каталога, они могут ис-пользовать имена, совпадающие с именами функций в других каталогах. Это свойство быва-ет полезным, если вы хотите создать свою версию какой-либо конкретной функции, сохраняя в то же время оригинальную функцию в другом каталоге. Так как MATLAB ищет среди част-ных функций прежде чем перейти к поиску в остальных каталогах, он всегда найдет частную функцию, например с именем test.m, раньше чем любую другую М-функцию, названную тем же именем test.m, но расположенную в других каталогах. Вы можете создавать свои частные директории просто путем создания стандартных подкаталогов, названных private. При этом не следует помещать директории private на ваших путях доступа.


Приложение 1. Тематические направления системы MATLAB


matlab\general - Команды общего назначения matlab\ops - Операторы и специальные символы matlab\lang - Конструкции языка и функции отладки matlab\elmat - Элементарные матрицы и операции на ними matlab\elfun - Элементарные математические функции matlab\specfun - Специальные математические функции matlab\matfun - Матричные функции и линейная алгебра matlab\datafun - Анализ данных и преобразование Фурье matlab\audio - Поддержка звуковых сигналов matlab\polyfun - Полиномы и интерполяция matlab\funfun - Нелинейные численные методы и решатели обыкновенных

дифференциальных уравнений (ODE solvers)

matlab\sparfun - Разреженные матрицы matlab\graph2d - Двумерная графика matlab\graph3d - Трехмерная графика matlab\specgraph - Специальная графика matlab\graphics - Дескрипторная графика (Handle Graphics) matlab\uitools - Инструменты графического интерфейса пользователя

(Graphical User Interface (GUI))

matlab\strfun - Функции обработки символьных строк matlab\iofun - Функции ввода/вывода matlab\timefun - Функции времени и даты matlab\datatypes - Типы данных и структуры matlab\verctrl - Выбор версии matlab\winfun - Интерфейс с операционной системой Windows (DDE/ActiveX) matlab\demos - Демонстрации и примеры возможностей системы MATLAB toolbox\local - Выбор характеристик (Preferences) simulink\simulink - Система моделирования Simulink simulink\blocks - Библиотека блоков (моделей) Simulink simulink\simdemos - Демонстрация и примеры системы Simulink 4 simdemos\aerospace - Simulink: Демонстрация и примеры космических моделей simdemos\automotive - Simulink: Демонстрация моделей САУ simdemos\simfeatures - Simulink: Демонстрация основных свойств simdemos\simgeneral - Simulink: Демонстрация примеров общих моделей simdemos\simnew - Simulink: Демонстрация новых свойств simulink\dee - Редактор дифференциальных уравнений stateflow\stateflow - Система моделирования событий Stateflow stateflow\sfdemos - Демонстрации возможностей и примеры Stateflow stateflow\coder - Кодирующее устройство системы Stateflow rtw\rtw - Моделирование систем реального времени Real-Time Workshop rtw\rtwdemos - Демонстрация возможностей системы Real-Time Workshop cdma\cdma - Библиотека моделей системы Simulink для систем

коммуникации (CDMA Reference Blockset)

cdma\cdmamasks - Функции поддержки моделей CDMA cdma\cdmamex - S-функции (S-Functions) системы CDMA cdma\cdmademos - Демонстрации и примеры системы CDMA commblks\commblks - Библиотека моделей устройств связи и коммуникации

(Communications Blockset)

commblks\commmasks - Функции поддержки моделей Communications Blockset commblks\commmex - S-функции библиотеки Communications Blockset commblks\commblksdemos - Демонстрации библиотеки Communications Blockset comm\comm - Системы связи и коммуникации (Communications Toolbox) comm\commdemos- Демонстрация возможностей пакета Communications Toolbox control\control - Системы управления (Control System Toolbox) control\ctrldemos - Демонстрации возможностей Control System Toolbox dspblks\dspblks - Библиотека для цифровой обработки сигналов (DSP Blockset) dspblks\dspmasks - Функции поддержки моделей DSP Blockset dspblks\dspmex - S-функции и МЕХ-файлы библиотеки DSP Blockset dspblks\dspdemos - Демонстрации и примеры библиотеки DSP Blockset  daq\daq - Сбор данных в режиме реального времени (Data Acquisition Toolbox) daq\daqdemos - Демонстрации и примеры пакета Data Acquisition Toolbox database\database - Работа с базами данных (Database Toolbox) database\dbdemos - Демонстрации возможностей пакета Database Toolbox datafeed\datafeed - Пакет сбора финансовой информации (Datafeed Toolbox) toolbox\dials - Интерфейс поддержки моделей Simulink ( Dials & Gauges

Blockset)

filterdesign\filterdesign - Проектирование фильтров (Filter Design Toolbox) ffilterdesign\filtdesdemos – Демонстрации пакета Filter Design Toolbox finderiv\finderiv - Расширение возможностей пакета Financial Toolbox

(Financial Derivatives Toolbox)

ftseries\ftseries - Временной анализ финансового рынка (Financial Time Series

Toolbox)

finance\finance - Финансы (Financial Toolbox) finance\calendar - Функции времени и даты пакета Financial Toolbox finance\findemos - Демонстрации возможностей пакета Financial Toolbox toolbox\fixpoint - Библиотека для моделирования с конечной разрядностью

(Fixed-Point Blockset)

fixpoint\fxpdemos - Демонстрации библиотеки Fixed-Point Blockset fuzzy\fuzzy - Размытые множества (Fuzzy Logic Toolbox) fuzzy\fuzdemos - Демонстрации возможностей пакета Fuzzy Logic Toolbox images\images - Обработка изображений (Image Processing Toolbox) images\imdemos - Демонстрации и примеры пакета Image Processing Toolbox instrument\instrument - Связь (поддержка интерфейса с аппаратурой пользователя)

(Instrument Control Toolbox)

lmi\lmictrl Приложения пакета LMI Control Toolbox в управлении lmi\lmilab - Синтез систем управления на основе линейных матричных

неравенств (LMI Control Toolbox)

toolbox\compiler - Компилятор системы MATLAB (MATLAB Compiler) map\map - Картография (Mapping Toolbox) mpc\mpccmds - Системы управления с эталонной моделью (Model Predictive

Control Toolbox)

mpc\mpcdemos - Демонстрации пакета Model Predictive Control Toolbox mutools\commands - μ-анализ и синтез систем управления (Mu-Analysis and

Synthesis Toolbox)

nnet\nnet - Нейронные сети (Neural Network Toolbox) nnet\nndemos - Демонстрации возможностей пакета Neural Network toolbox\ncd - Проектирование нелинейных систем управления (Nonlinear

Control Design Blockset)

toolbox\optim - Оптимизация (Optimization Toolbox) toolbox\pde - Дифференциальные уравнения в частных производных и метод

конечных элементов (Partial Differential Equation Toolbox)

powersys\powersys - Моделирование энергетических систем (Power System

Blockset)

powersys\powerdemo - Демонстрации моделей Power System Blockset targets\ecoder - Создание пользовательских программ на основе моделей

Simulink (Real-Time Workshop Embedded Coder)

toolbox\robust - Синтез робастных систем управления (Robust Control Toolbox) signal\signal - Обработка сигналов (Signal Processing Toolbox) signal\sigdemos - Демонстрации возможностей пакета Signal Processing Toolbox toolbox\splines - Сплайн-аппроксимация (Spline Toolbox) toolbox\stats - Статистика (Statistics Toolbox) toolbox\symbolic - Символьная математика (Symbolic Math Toolbox) ident\ident - Идентификация параметров систем управления (System

Identification Toolbox)

wavelet\wavelet - Импульсная декомпозиция сигналов и изображений (Wavelet

Toolbox)

wavelet\wavedemo - Демонстрация возможностей пакета Wavelet Toolbox xpc\xpc - Пакет макетирования и контроля систем реального

времени (xPC Target)

xpc\xpcdemos - Демонстрации возможностей пакета xPC Target

 

Примечание. Нзвание каждого тематического направления определяет соответствую-щую директорию (каталог) системы MATLAB.


Приложение 2. Команды общего назначения (General purpose commands)

 

Директория - matlab\general


Общая информация (General information)

 

help - Оперативная справка, выводит текст в командную строку. helpwin - Оперативная справка, выводит информацию в специальном окне (help

browser).

helpdesk - Исчерпывающая информация в рабочем окне помощи. support - Открывает Web-страницу технической помощи фирмы MathWorks. demo - Выполняет демонстрационные ролики. java - Использование средств Java из MATLAB-а. ver - Информация о версиях MATLAB-а, SIMULINK-а и прикладных пакетов. whatsnew - Вызов информации о новых свойствах версий.

 

Управление рабочим пространством ( Managing the workspace)

 

who - Выводит в командное окно список текущих переменных. whos - Выводит в командное окно список текущих переменных в длинном

формате, с указанием размеров, числа байтов и классов.

workspace - Вызывает Окно Просмотра Рабочего Пространства (Workspace

Browser), т.е.специальный Графический Интерфейс Пользователя (GUI)

для выполнения действий с переменными рабочего пространства.

clear - Удаляет переменные и функции из памяти. pack - Дефрагментация рабочей области памяти. load - Загрузка переменных в рабочее пространство из диска. save - Сохранение переменных рабочего пространства на диск. quit - Прекращение сеанса работы системы MATLAB.

 

Управляющие команды и функции (Managing commands and functions)

 

what - Выводит список файлов MATLAB-а в текущей директории в

командное окно.

type - Печатает содержимое заданного М.-файла в командном окне. edit - Вызывает окно Редактора/Отладчика. open - Открывает файлы по расширению. which - Локализирует (выводит в командное окно) путь доступа к

функциям и файлам.

pcode - Создает Р-файл псевдокода с выполнением грамматического анализа. inmem  - Выводит список функций в памяти. mex - Компилирует МЕХ-файлы.

 

 Управление путями доступа (Managing the search path) path - Вывод/изменение путей доступа. addpath - Прибавляет директорию к путям доступа. rmpath - Удаляет директорию из путей доступа . pathtool - Модифицирует пути доступа. rehash - Управление кеш-памятью. import - Импортирование пакетов Java в текущую область.

Управление командным окном (Controlling the command window)

 

echo - Вывод в командное окно исполняемых в М-файлах команд. more - Управление постраничным выводом информации на экран. diary - Сохранение записи (дневника) сеанса работы системы MATLAB . format - Контроль формата вывода данных на экран. beep - Производит звуковой сигнал (beep).

Команды операционной системы (Operating system commands)

 

cd - Изменить текущей директории. copyfile - Копировать файла. pwd - Показать (напечатать) текущую рабочую директорию. dir - Вывод на экран листинга каталога. delete - Удалить файл. getenv - Получение значения переменной из внешней операционной среды. mkdir - Создать директорию. ! - Выполнить команды операционной системы. dos - Выполнить команду DOS и вернуть результат. unix - Выполнить команду UNIX и вернуть результат. vms - Выполнить команду VMS DCL и вернуть результат. web - Вызвать Web browser. computer - Выдать тип компьютера. isunix - Истинно, если установлена UNIX-версия MATLAB-а. ispc - Истинно, если установлена PC (Windows)-версия MATLAB-а.

Отладка М-файлов ( Debugging M-files)

 

debug - Вывести список команд отладки и редактирования файлов. dbstop - Установить точку останова (контральнуюточку). dbclear - Удалить контрольную точку. dbcont - Продолжить выполнение. dbdown - Переход между рабочими пространствами редактируемых функций

сверху вниз.

dbstack - Вывести в командное окно стек вызываемых функций. dbstatus - Вывести список всех контрольных точек. dbstep - Выполнить одну или более строк. dbtype - Напечатать в командном окне редактируемый файл с указанием

номеров строк.

dbup - Переход между рабочими пространствами редактируемых функций

снизу вверх.

dbquit - Выход из режима отладки. dbmex - Отладка MEX-файлов (только для системы UNIX).

 Профилировщик М-файлов (Profiling M-files)

 

profile - Измерить и вывести на экран временные затраты при выполнении файла profreport - Сформировать отчет о профилировании файла.

Функции для определения местонахождения зависимых функций М-файла (Tools to locate dependent functions of an M-file).

 

depfun - Определить местонахождение функций, от которых зависит М-файл. depdir - Определить местонахождение директории, гдерасположены функции,

от которых зависит М-файл.

inmem - Вывести в командное окно список функций в памяти.     Приложение 3. Операторы и специальные символы

Директория - matlab\ general

 

Арифметические операторы (Arithmetic operators)

plus - Plus + - Сложение. uplus - Unary plus + - Унарное сложение. minus - Minus - - Вычитание. uminus - Unary minus - - Унарное вычитание. mtimes - Matrix multiply * - Умножение матриц. times - Array multiply .* - Умножение массивов. mpower - Matrix power ^ - Возведение в степень матриц . power - Array power .^ - Возведение в степень массивов. mldivide - Left matrix divide \ - Левое деление матриц. mrdivide - Right matrix divide / - Правое деление матриц. ldivide - Left array divide .\ - Левое деление массивов. rdivide - Right array divide ./ - Правое деление массивов. kron - Kronecker tensor product - Кронекеровское произведение.

Операторы отношения (Relational operators)

 

eq - Equal == ne - Not equal ~= lt - Less than < gt - Greater than  > le - Less than or equal <= ge - Greater than or equal >=

Логические операторы (Logical operators)

 

and - Logical AND & - Логическое «Да». or - Logical OR | - Логическое «Или». not - Logical NOT ~ - Логическое «Нет». xor - Logical EXCLUSIVE OR - Логическое исключающее «Или». any - Истинно, если хоть один из элементов вектора не равен нулю. all - Истинно, если все элементы вектора не равны нулю.

Специальные символы (Special characters.)

 

colon - : - Двоеточие. paren - ( ) - Круглые скобки и индексация. paren - [ ] - Квадратные скобки. paren - { } – Фигурные скобки и индексация. punct - @ - Создание дескриптора функций. punct - . – Десятичная точка. punct - . – Доступ к полю структуры. punct - .. – Родительская директория. punct - ... - Продолжение. punct - , - Разделитель. punct - ; - Точка с запятой. punct - % - Комментарий. punct - !  - Вызов команды операционной системы. punct - = - Присвоение значений. punct - ' - Кавычка. transpose - .' - Поэлементное транспонирование. ctranspose - ' - Транспонирование и комплексное сопряжение. horzcat - [ , ] - Горизонтальное объединение объектов. vertcat - [ ; ] - Вертикальное объединение объектов. subsasgn - ( ),{ },. – Индексное присвоение. subsref - ( ),{ },. – Индексная ссылка. subsindex - - Индексный дескриптор

Операторы побитовой обработки (Bitwise operators)

 

bitand - Побитовое логическое умножение (Bit-wise AND). bitcmp - Побитовое n-разрядное дополнение. bitor - Побитовое логическое «Или» (Bit-wise OR). bitmax - Максимальное целое число. bitxor - Побитовое логическое исключающее «Или» (Bit-wise XOR). bitset - Установить значение бита. bitget - Получить значение бита. bitshift - Сложение битов по модулю 2.

Операторы обработки множеств (Set operators)

 

union - Объединение множеств. unique - Удаление из множеств одинаковых элементов. intersect - Пересечение множеств. setdiff - Разность множеств. setxor - Операция исключающего «Или» над множествами. ismember - Выявление одинаковых элементов.

 

Приложение 4. Элементарные математические функции

(Elementary math functions).

Директория matlab\elfun

Тригонометрические функции (Trigonometric)

 

sin - Синус. sinh - Гиперболический синус. asin - Обратный синус. asinh - Обратный гиперболический синус. cos - Косинус. cosh - Гиперболический косинус. acos - Обратный косинус. acosh - Обратный гиперболический косинус. tan - Тангенс. tanh - Гиперболический тангенс. atan - Обратный тангенс. atan2 - 4-х квандрантный обратный тангенс. atanh - Обратный гиперболический тангенс. sec - Секанс. sech - Гиперболический секанс. asec - Обратный секанс. asech - Обратный гиперболический секанс. csc - Косеканс. csch - Гиперболический косеканс. acsc - Обратный косеканс. acsch - Обратный гиперболический косеканс. cot - Котангенс. coth - Гиперболический котангенс. acot - Обратный котангенс. acoth - Обратный гиперболический котангенс.

Экспоненциальные функции (Exponential)

 

exp - Экспоненциальная функция. log - Натуральный логарифм. log10 - Логарифм по основанию 10. log2 - Логарифм по основанию 2 . pow2 - Экспонента по основанию 2. sqrt - Квадратный корень. nextpow2 -Ближайшая степень по основанию 2.

Комплексные числа (Complex)

 

abs - Абсолютное значение числа. angle - Аргумент комплексного числа. complex - Конструирование комплексных данных из действительных и мнимых

частей.

conj - Комплексное сопряжение. imag - Мнимая часть комплексного числа. real - Действительная часть комплексного числа. unwrap - Корректировка фазового угла. isreal - Истинно, если массив содержит реальные числа. cplxpair - Сортировка чисел в комплексно-сопряженные пары.

Округление и остатки (Rounding and remainder)

 

fix - Округление в сторону нуля. floor - Округление в сторону минус бесконечность. ceil - Округление в сторону плюс бесконечность round - Округление в сторону ближайшего целого числа. mod - Остаток со знаком после деления (Modulus or signed remainder after

division).

rem - Остаток после деления. sign - Функция знака (Signum).
Приложение 5. Элементарные матрицы и операции над ними

(Elementary matrices and matrix manipulation)

Директория matlab\elmat

Элементарные матрицы и векторы (Elementary matrices)

 

zeros - Формирование массива нулей (матрицы из нулей). ones - Формирование массива единиц. eye - Единичная матрица. repmat - Формирование многомерного массива из блоков. rand - Равномерно распределенные случайные числа. randn - Нормально распределенные случайные числа. linspace - Формирование массива равноотстоящих чисел. logspace - Формирование узлов логарифмической сетки. freqspace - Формирование массива частот для частотных откликов. meshgrid - Формирование узлов двумерной и трехмерной сеток (для построения

трехмерных графиков).

: - Формирование векторов с равноотстоящими значениями и

индексирование матриц.


Основная информация о массивах (Basic array information)

 

size - Размер массива (матрицы). length - Длина вектора. ndims - Число размерностей массива. disp - Вывод в командное окно матрицы или текста. isempty  - Истинно для пустых массивов. isequal - Истинно для одинаковых массивов. isnumeric - Истинно для числовых массивов. islogical - Истинно для логических массивов. logical - Преобразование числовых массивов в логические.

Преобразования матриц (Matrix manipulation)

 

reshape - Преобразование размеров многомерного массива. diag - Диагональные матрицы и диагонали матриц. blkdiag - Блочно-диагональное объединение матриц. tril - Извлечение нижней треугольной части матрицы. triu - Извлечение верхней треугольной части матрицы. fliplr - Зеркальное отображение слева направо. flipud - Зеркальное отображение сверху вних. flipdim - Зеркальное отображение вдоль заданной размерности (обобщенное

транспонирование).

rot90 - Поворот матриц на 90 градусов. find - Определение индексов ненулевых элементов массива. end - Последний индекс по указанной размерности. sub2ind - Преобразование многомерной нумерации в последовательную. ind2sub - Преобразование последовательной нумерации в многомерную.

Специальные символы, переменные и константы (Special variables and constants)

 

ans - Результат выполнения последней операции. eps - Точность машинного представления чисел с плавающей запятой. realmax - Наибольшее положительное число с плавающей запятой. realmin - Наименьшее положительное число с плавающей запятой. pi - 3.1415926535897.... i, j - Мнимая единица. inf - Бесконечность. NaN - Нечисловое значение. isnan - Истинно для нечисловых значений. isinf - Истинно для бесконечных значений. isfinite - Истинно для конечных значений. why - Выдает ответ в виде набора случайных фраз.

Специальные типы матриц (Specialized matrices)

 

compan - Сопутствующая матрица. gallery - Набор тестовых матриц. hadamard - Матрица Адамара. hankel - Матрица Ганкеля. hilb - Матрица Гильберта. invhilb - Обратная матрица Гильберта. magic - Матрица «Волшебный квадрат». pascal - Матрица Паскаля. rosser - Матрица Рессера (тестовая матрица для классической симметричной

проблемы собственных значений).

toeplitz - Матрица Теплица (Toeplitz matrix). vander - Матрица Вандермонда (Vandermonde matrix). wilkinson - Матрица Уилкинсона (тестовая матрица Уилкинсона (Wilkinson) для

задачи на собственные значения.


Приложение 6. - Матричные функции и линейная алгебра

(Matrix functions - numerical linear algebra)

Директория matlab\matfun

Матричный анализ (Matrix analysis)

 

norm - Нормы векторов и матриц. normest - Оценка 2-нормы матриц. rank - Ранг матрицы. det - Детерминант матрицы trace - След матрицы (сумма диагональных элементов). null - Нуль- пространство (ядро) матрицы. orth - Ортонормальный базис матрицы. rref - Треугольная форма матрицы (Reduced row echelon form). subspace - Угол между двумя подпространствами.

Линейные уравнения (Linear equations)

 

\ and / - Решение линейных уравнений (см. Приложение 3. Арифметические

операторы)

inv - Обратная матрица. rcond - Обратная величина числа обусловленности матрицы ,найденная при по-

мощи вычислителя пакета LAPACK (LAPACK reciprocal condition estimator).

cond - Число обусловленности по отношению к обращению матриц. condest - Оценка числа обусловленности 1-нормы матрицы. normest1 - Оценка 1-нормы матрицы. chol - Разложение Холецкого (Cholesky factorization). cholinc - Неполное разложение Холецкого (Incomplete Cholesky factorization). lu - LU-разложение (LU factorization). luinc - Неполное LU-разложение (Incomplete LU factorization). qr - Ортогонально-треугольная декомпозиция. lsqnonneg - Метод наименьших квадратов с неотрицательными ограничениями. pinv - Псевдообратная матрица. lscov - Метод наименьших квадратов в присутствии шумов.

Собственные значения и сингулярные числа (Eigenvalues and singular values)

 

eig - Собственные значения и собственные векторы. svd - Сингулярное разложение матрицы. gsvd - Обобщенное сингулярное разложение матрицы. eigs - Вычисление нескольких собственных значений (с наибольшими

модулями).

svds - Вычисление нескольких сингулярных чисел. poly - Характеристический полином матрицы. polyeig - Вычисление собственных значений матричного полинома (Polynomial

eigenvalue problem).

condeig - Число обусловленности относительно собственных значений матрицы. hess - Приведение к форме Хессенберга (Hessenberg form). qz - QZ-факторизация (приведение пары матриц к обобщенной форме Шура). schur - Приведение к форме Шура (Schur decomposition).

Вычисление функций от матриц (Matrix functions).

 

expm - Вычисление матричной экспоненты. logm - Вычисление логарифма матрицы. sqrtm - Вычисление квадратного корня матрицы. funm - Вычисление произвольной функции от матрицы. expm1 - Матричная экспонента с использованием разложения Паде. expm2 - Матричная экспонента с использованием разложения в ряд Тейлора. expm3 - Матричная экспонента с использованием собственных значений и

собственных векторов.


Утилиты для процедур факторизации матриц (Factorization utilities)

 

qrdelete - Удалить столбец в QR -разложении. qrinsert - Вставить столбец в QR-разложение. rsf2csf - Преобразование действительной блочно-диагональной формы к

комплексной диагональной форме.

cdf2rdf - Преобразование комплексной блочно-диагональной формы к

действительной диагональной форме.

balance - Масштабирование матрицы для повышения точности вычисления

собственных значений.

planerot - Преобразование Гивенса (плоское вращениеГивенса). cholupdate - Разложение Холецкого модифицированной матрицы. qrupdate - QR –разложение модифицированной матрицы.

Приложение 7. Полиномы и интерполяция (Interpolation and polynomials)

Директория matlab\polyfun

Интерполяция данных (Data interpolation)

 

pchip - Интерполяция кусочным кубическим полиномом Эрмита. interp1 - Одномерная табличная интерполяция. interp1q - Быстрая одномерная табличная интерполяция. interpft - Одномерная интерполяция с использованием быстрого преобразования

Фурье.

interp2 - Двумерная табличная интерполяция. interp3 - Трехмерная табличная интерполяция. interpn - Многомерная табличная интерполяция. griddata - Двумерная интерполяция на неравномерной сетке. griddata3 - Трехмерная интерполяция на неравномерной сетке. griddatan - Многомерная интерполяция на неравномерной сетке.

 Интерполяция сплайнами (Spline interpolation)

 

spline - Кубическая интерполяция сплайнами. ppval - Оценка кусочно-непрерывных полиномов.

 Геометрический анализ (Geometric analysis)

 

delaunay - Построение триангуляционной сетки (Delaunay triangulation). delaunay3 - Трехмерная сотовая сетка Делануа (3-D Delaunay tessellation). delaunayn - Многомерная сотовая сетка Делануа (N-D Delaunay tessellation). dsearch - Поиск ближайшей точки в триангуляции Делануа. dsearchn - Поиск ближайшей точки в многомерной сотовой сетке Делануа. tsearch - Ближайшая точка двумерной триангуляции. tsearchn - Ближайшая точка многомерной триангуляции. convhull - Построение двумерной выпуклой оболочки. convhulln - Построение многомерной выпуклой оболочки. voronoi - Построение диаграммы Вороного. voronoin - Построение многомерной диаграммы Вороного. inpolygon - Истинно для точек области, ограниченной многоугольником. rectint - Площади областей пересечения двух семейств прямоугольников. polyarea - Площадь прямоугольника.

Полиномы (Polynomials)

 

roots - Нахождение корней полиномов. poly - Вычисление характеристического полинома матрицы или определение

полинома с заданными корнями.

polyval - Вычисление значений полиномов в заданных точках. polyvalm - Вычисление значений матричного полинома. residue - Разложение на простые дроби (вычисление вычетов). polyfit - Аппроксимация данных полиномом. polyder - Вычисление производных от полиномов. polyint - Аналитическое интегрирование полиномов. conv - Умножение полиномов. deconv - Деление полиномов.
Приложение 8. Анализ данных и преобразование Фурье (Data analysis and Fourier transforms)

Директория matlab\datafun

 

Основные операции (Basic operations)

 

max - Определение максимальных элементов массива. min - Определение минимальных элементов массива. mean - Определение средних значений элементов массива. median - Определение медиан (срединных значений). std - Определение стандартных отклонений элементов массива. var - Определение дисперсий элементов массива. sort - Сортировка элементов массива. sortrows - Сортировка строк матриц. sum - Суммирование элементов массива. prod - Произведение элементов массива. hist - Построение гистограммы. histc - Подсчет элементов гистограммы. trapz - Численное интегрирование методом трапеций. cumsum - Куммулятивная сумма элементов массива. cumprod - Куммулятивное произведение элементов массива. cumtrapz - Куммулятивное численное интегрирование методом трапеций.

Конечные разности (Finite differences)

 

diff - Вычисление конечных разностей и приближенное дифференцирование. gradient - Приближенное вычисление градиента функций. del2 - Дискретная аппроксимация дифференциального оператора Лапласа.

Корреляционные соотношения (Correlation)

 

corrcoef - Вычисление коэффициентов корреляции. cov - Вычисление ковариационной матрица. subspace - Вычисление угла между двумя подпространствами.

Фильтрация и свертка (Filtering and convolution)

 

filter - Одномерная цифровая фильтрация. filter2 - Двумерная цифровая фильтрация. conv - Свертка и умножение полиномов. conv2 - Двумерная свертка. convn - N-мерная (многомерная) свертка. deconv - Обращение свертки и деление полиномов. detrend - Удаление линейного тренда.

Преобразование Фурье (Fourier transforms)

 

fft - Дискретное преобразование Фурье. fft2 - Двумерное дискретное преобразование Фурье. fftn - Многомерное дискретное преобразование Фурье. ifft - Обратное дискретное преобразование Фурье. ifft2 - Двумерное обратное дискретное преобразование Фурье. ifftn - Многомерное обратное дискретное преобразование Фурье. fftshift - Перенос нулевой частоты в середину спектра. ifftshift - Аннулирование переноса нулевой частоты в середину спектра.

Приложение 9. Функции обработки символьных строк (Character strings)

Директория matlab\strfun

Общие (General)

char - Сформировать массив символов (строку). double - Преобразовать символы строки в числовые коды. cellstr - Преобразовать массив символов в массив ячеек для строк. blanks - Сформировать строку пробелов. deblank - Удалить пробелы в конце строки. eval - Выполнение выражения, записанного в виде строки символов.

Проверка строк (String tests)

 

ischar - Истинно, если это массив символов. iscellstr - Истинно, если это массив ячеек для строк. isletter - Истинно, если это символ (буква) алфавита. isspace - Истинно, если это пробел.

Операции над строками (String operations)

 

strcat - Горизонтальное объединение строк. strvcat - Вертикальное объединение строк. strcmp - Сравнить строки. strncmp - Сравнить первые N символов строк. strcmpi - Сравнить строки игнорируя регистр. strncmpi - Сравнить первые N символов строк игнорируя регистр. findstr - Найти заданную строку в составе другой строки. strjust - Выравнять массив символов. strmatch - Найти все совпадения. strrep - Заменить одну строку другой. strtok - Найти часть строки, ограниченную разделителями (token). upper - Перевести все символы строки в верхний регистр. lower - Перевести все символы строки в нижний регистр.

Преобразования строк (String to number conversion)

 

num2str - Преобразование числа в строку. int2str - Преобразование целых чисел в строку. mat2str - Преобразование матрицы в строку. str2double - Преобразование строки в число удвоенной точности. str2num - Преобразование массива строк в числовой массив. sprintf - Записать форматированные знаки в виде строки. sscanf - Прочитать строку с учетом формата.

Преобразование систем счисления (Base number conversion)

 

hex2num  - Преобразовать шестнадцатеричное число в число удвоенной

точности.

hex2dec - Преобразовать шестнадцатеричное число в десятичное число. dec2hex - Преобразовать десятичное число в шестнадцатеричное число. bin2dec - Преобразовать двоичную строку в десятичное число. dec2bin - Преобразовать десятичное число в двоичную строку. base2dec - Преобразовать В-строку в десятичное число. dec2base - Преобразовать десятичное число в В-строку.

Справочник по базовым функциям

системы MATLAB

 

 

Функция PLOT

 

Назначение - Двумерный линейных график

 

Синтаксис - plot(Y)

plot(X1, Y1, ...)

plot(X1, Y1, LineSpec, ...)

plot(..., 'PropertyName', PropertyValue, ...)

h = plot(...)

Описание. Если прямоугольный числовой массив Y является действительным, то функция plot(Y) строит линейные графики столбцов массива Y в зависимости от индексов их элементов. Если Y содержит комплексные числа, то запись plot(Y) эквивалентна записи plot(real(Y), imag(Y)). Во всех остальных случаях, при использовании plot мнимые компо-ненты игнорируются.

Команда plot(X1, Y1, ...), где количество пар массивов может быть произвольным, осуществ-ляет следующие построения.

·     Если оба массива одномерные, то строится линейный график функции, где одномер-ный массив X1 соответствует значениям аргумента, а одномерный массив Y1 – зна-чениям функции.

·     Если оба массива X1 и Y1 – двумерные (они должны иметь при этом одинаковую размерность), то строятся попарно линейные зависимости столбцов Y1 от соответст-вующих столбцов X1.

·     Если массив Y1 двумерный, а массив X1 одномерный, то строятся линейные графики всех столбцов или строк массива Y1 в зависимости от элементов вектора X1. Выбор столбцов или строк массива Y1 здесь определяется размерностью вектора X1, то есть это могут быть и столбцы и строки (если массив Y1 - квадратный, то приоритет отда-ется столбцам)

·     Если двумерным является массив X1, а массив Y1 одномерный (то есть вектор), то строятся графики столбцов или строк массива X1 в зависимости от элементов векто-ра Y1 (см. также предыдущий вариант).

Функция plot(X1, Y1, LineSpec,...) осуществляет приведенные выше построения, причем в спецификации линий LineSpec можно указать типы линий, символы маркеров и их цвета. Вы можете комбинировать тройки Xn, Yn, LineSpec с парами Xn, Yn, т.е. задавать специ-фикации LineSpec только для некоторых пар массивов, например: plot(X1, Y1, X2, Y2, LineSpec, X3, Y3).

Функция plot(... , 'PropertyName', PropertyValue,...) устанавливает свойство всех постро-енных линий, указанное строкой 'PropertyName', в соответствие с его значением, заданным в PropertyValue (См. раздел «Примеры» ниже).

h = plot(...) возвращает вектор-столбец всех дескрипторов (handles) построенных на графи-ке линий, по одному дескриптору на каждую линию.

Замечания. Если вы не задаете цвета при построении более чем одной линии, то функция plot циклически выбирает последовательные цвета так, как они указаны в свойстве ColorOrder текущих осей. После того как все цвета, определенные в ColorOrder, будут ис-пользованы, функция plot использует циклически стили линий (line styles) так, как они определены в свойстве LineStyleOrder текущих осей. При этом, после перехода к каждому новому стилю линии, происходит циклический выбор всех определенных цветов. Отметим, что по умолчанию, система MATLAB восстанавливает свойства ColorOrder и LineStyleOrder при каждом новом вызове функции plot. Если вы хотите сохранить введенные вами в данные свойства изменения, то вы должны задать эти изменения как значения по умолчанию. Например, команда

set(0, 'DefaultAxesColorOrder', [0 0 0], 'DefaultAxesLineStyleOrder', '-|-.|--|:')

 

задает на корневом (экранном) уровне использование только черного цвета при построении линий (свойство ColorOrder), а также использование следующих стилей линий (свойство LineStyleOrder) : сплошная линия (-), штрих-пунктирная линия (-.), штриховая линия (--) и пунктирная линия (:).

Дополнительная информация

 • Для получения более обширной информации по заданию стилей и цветов линии см. раз-дел LineSpec.

 

Примеры

 


Информация о работе «Система математических расчетов MATLAB»
Раздел: Информатика, программирование
Количество знаков с пробелами: 249178
Количество таблиц: 21
Количество изображений: 46

Похожие работы

Скачать
60285
0
0

... должны быть прямоугольными. 5. Полиномы По степени применимости, по разнообразию и качеству соответствующих команд скалярные полиномы – следующие за матрицами математические объекты в MATLAB'е. Полином p(x)=anxn+an-1xn-1+...+a0 задается вектором-строкой p из чисел an, an-1, ... , a0, т.е. коэффициентами, расположенными в порядке убывания показателя степени. Его степень n задавать не ...

Скачать
29192
2
0

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

Скачать
114601
5
73

... концентрических окружностей с уменьшающимся радиусом по мере затухания колебаний скорости и момента. Аналогичная картина наблюдается при ступенчатом набросе нагрузки. 5. РАЗРАБОТКА ВИРТУАЛЬНОЙ ЛАБОРАТОРНОЙ РАБОТЫ НА БАЗЕ ВИРТУАЛЬНОЙ АСИНХРОННОЙ МАШИНЫ   Иную возможность анализа АД представляет специализированный раздел по электротехнике Toolbox Power System Block. В его библиотеке имеются блоки ...

Скачать
80660
0
0

... Работа с демонстрационными примерами с командной строки   Вызов списка демонстрационных примеров Одним из самых эффективных методов знакомства со сложными математическими системами является ознакомление со встроенными примерами их применения. Система MATLAB содержит многие сотни таких примеров – по примеру практически на каждый оператор или функцию. Наиболее поучительные примеры можно найти ...

0 комментариев


Наверх