Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MATLAB_03

.pdf
Скачиваний:
75
Добавлен:
21.04.2015
Размер:
513.29 Кб
Скачать

1

Лекция 3. Основные типы массивов и графика в MATLAB

1.Основные типы массивов в MATLAB.

2.Числовые массивы — numeric array.

3.Массивы логического типа — logical array.

4.Массивы символьного типа — char array.

5.Массивы записей (структуры) — struct array.

6.Массивы ячеек — cell array.

7.Определение типа массива.

8.Общие правила при выводе графиков.

9.Двумерная графика.

10.Трехмерная графика.

3.1. Основные типы массивов в MATLAB

Массивом называют упорядоченную совокупность данных, объединенных одним именем.

В линейной алгебре массив характеризуется:

размерностью.

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

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

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

(матрица)

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

Рис. 1. Графическое отображение одномерного, двумерного и трехмерного массивов

размером.

Размер массива указывают в виде произведения числа элементов по каждому индексу: n — одномерный массив; m × n — двумерный; m × n × l — трехмерный и т. д.

типом.

Тип массива определяется типом его элементов.

В MATLAB тип массива не инициализируется (предварительно не объявляется).

Все массивы в MATLAB можно объединить в две группы:

числовые массивы;

нечисловые массивы.

В табл. 1 представлены их основные типы массивов из этих групп.

Таблица 1. Основные типы массивов в MATLAB

Числовые массивы (numeric array)

Нечисловые массивы

 

 

2

Тип массива

Наименование

Тип массива

наименование

 

 

 

 

double

вещественный,

logical array

логический

 

двойной точности

 

 

 

 

 

 

single

вещественный,

char array

массив символов

 

одинарной точности

 

 

 

 

 

 

int<…>

целый со знаком,

struct array

массив записей

<…> 8,16,32,64

8, 16, 32,или 64-

(structure)

(структура)

 

битовый

 

 

 

 

 

 

uint<…>

целый без знака,

cell array

массив ячеек

 

8, 16, 32, или 64-

 

 

 

битовый

 

 

 

 

 

 

Напомним, что в MATLAB по умолчанию любая переменная считается матрицей, поэтому далее особое внимание уделено матрицам различных типов.

Исключение составляет массив записей — особый тип нечислового массива, не адекватный его определению в линейной алгебре.

3.2. Числовые массивы — numeric array

Числовые массивы объединяют в себе следующие типы массивов (табл. 1):

double;

single;

int8, int16, int32, или int64;

uint8, uint16, uint32, или uint64.

По умолчанию матрица относится к типу double.

Элементами матриц типа double являются константы вещественного типа двойной точности (15 значащих цифр после запятой).

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

В Лекции 2 по умолчанию рассматривались матрицы типа double.

Элементами матриц типа single являются константы вещественного типа одинарной точности (вдвое меньшей).

Преобразование матрицы A типа double в матрицу типа single выполняется с помощью функции:

single(A)

С этим типом матриц мы работать не будем.

Элементами матриц типа int8, int16, int32, и int64 являются константы целого

типа со знаком.

Для элементов матриц типа int8 целые константы расположены в диапазоне от –128

до 127, где 128 = 27 и т. д.

Во внутренних вычислениях им соответствуют двоичные эквиваленты,

соответственно, длиной 8, 16, 32 или 64 бита, где старший бит — знаковый.

Элементами матриц типа uint8, uint16, uint32, и uint64 являются константы

целого типа без знака.

Для элементов матриц типа uint8 целые константы расположены в диапазоне от 0

до 255, где 255 = 28 и т. д.

Во внутренних вычислениях им соответствуют двоичные эквиваленты,

соответственно, длиной 8, 16, 32 или 64 бита, где старший бит — значащий.

Матрицы типа int8 и uint8 (и им подобные) вводятся с помощью функций:

int8(A)

uint8(A)

где A — матрица с элементами в квадратных скобках:

Например:

3

>> A = int8([120 -115;-75.7 14.1])

A=

120 -115 -76 14

Преобразование матрицы A типа double в матрицы типа int8 и uint8 (и им подобные) выполняется с помощью тех же функций:

Например, сформируем A типа double:

>> A = [-15.7 129.5;-130.8 13.9]

A=

-15.7000 129.5000

-130.8000 13.9000

Преобразуем ее в матрицу B типа int8:

>> B = int8(A)

B=

-16 127

-128 14

и в матрицу C типа uint8:

>> C = uint8(A)

C =

0130

014

Сматрицами типа int и uint разрешены операции:

поэлементные арифметические;

матричного сложения и вычитания;

отношения;

логические.

С матрицами типа uint дополнительно разрешены побитовые операции:

С матрицами типа int и uint запрещены операции:

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

вычисления большинства элементарных функций.

3.3. Массивы логического типа — logical array

Массив логического типа — это нечисловой массив (табл. 1), элементами которого являются логические константы 1 (true) и 0 (false).

Элементы логической матрицы могут вводиться как true и false или 1 и 0, но выводятся только как 1 и 0:

>> A = [true false;false true]

A =

10

01

>>B = [0 1;1 1]

B =

 

0

1

1

1

В MATLAB тип массива не инициализируется, поэтому во внутренних вычислениях матрица с элементами 1 и 0 может быть отнесена как к типу double, так и к логическому типу, в зависимости от выполняемых операций.

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

>> A > B % операция отношения

4

ans =

10

00

>>A | B % логическая операция ИЛИ

ans =

11

11

>>A+B % арифметическая операция

ans =

11

12

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

>> x = [sin(3)<0.5 1;0 (sin(3)<0.1)&(cos(3)<0.2)]

x =

11

00

3.4.Массивы символьного типа — char array

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

Матрица символьного типа формируется по столбцам:

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

Автоматическое добавление пробелов в элементах столбца с выравниванием по левому краю выполняется с помощью функции:

a = char('<char1>','<char2>'...)

где <char1>,<char2>... — элементы столбца — символьные константы с произвольным количеством символов:

>>a = char('Newton','Scientist','English') a =

Newton Scientist English

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

>>b = ['Newton' 'Scientist' 'English']

a =

NewtonScientistEnglish

Пробелы должен предусмотреть пользователь:

>>b = [' Newton ' ' Scientist ' ' English'] a =

Newton Scientist English

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

Одна функция char описывает один столбец матрицы.

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

>>X = [char('a','aaa') char(' bb',' b') char(' ccc',' c')]

X =

abb ccc

aaab c

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

num2str(A)

Например:

5

>> A = [-15.7 129.5;-130.8 13.9]

A=

-15.7000 129.5000

-130.8000 13.9000

>> simbol_A = num2str(A)

simbol_A =

-15.7

129.5

-130.8

13.9

>> B = int8(A)

B =

 

-16

127

-128

14

>> simbol_B = num2str(B)

simbol_B =

-16 127

-128 14

Однако обратное преобразование невозможно!

3.5. Массивы записей (структуры) — struct array

Массив записей (структура) — это нечисловой массив (табл. 1), элементами которого являются записи.

Массив записей используется в различных приложениях для описания

M объектов, i = 1, 2, ... , M ,

каждый из которых характеризуется

N параметрами, n = 1, 2, ... , N .

Массив записей (структура) упорядочивает записи об объектах и их параметрах.

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

1.поле (field) — имя n-го параметра: скаляра, вектора или матрицы заданного типа;

Число полей равно числу параметров N .

2.значение поля — значение n-го параметра;

3.список полей — список имен параметров;

4.запись — список полей, одинаковый для всех объектов;

Число записей равно числу объектов M .

5.значение записи — список полей с их значениями для i -го объекта.

Массив записей (структура) представляет собой упорядоченную совокупность значений записей, объединенная одним именем с одним индексом.

Значение i -й записи формируется по каждому n-му полю:

<имя массива>(<i>).<имя n-го поля> = <значение n-го поля>

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

Размер массива записей равен числу записей M .

Для формирования M записей по N полям потребуется M × N операторов присваивания.

Сформируем массив записей (структуру) с именем personal для описания трех объектов — трех известных ученых — четырьмя параметрами:

M = 3 , i = 1, 2, 3 ;

N = 4 , n = 1, 2, 3, 4 .

M × N = 12

6

Запись будет включать в себя список из N = 4 полей — имен параметров: surname — фамилия ученого — скаляр символьного типа;

data — дата рождения ученого (число, месяц, год) — вектор численного типа; area — область науки — скаляр символьного типа;

disciples — наличие известных учеников — скаляр логического типа.

Для формирования M = 3 записей по N = 4 полям потребуется операторов присваивания:

>>personal(1).surname = 'Newton';

>>personal(2).surname = 'Darvin';

>>personal(3).surname = 'Fourier';

>>personal(1).data = [25 12 1642];

>>personal(2).data = [12 2 1809];

>>personal(3).data = [21 3 1768];

>>personal(1).area = 'физика';

>>personal(2). area = 'биология';

>>personal(3).area = 'математика';

>>personal(1).disciples = false;

>>personal(2).disciples = false;

>>personal(3).disciples = true;

Размер матрицы записей personal равен числу записей M = 3 .

Список полей выводится по имени массива записей:

>> personal personal =

1x3 struct array with fields: surname

data area disciples

Значение i-й записи выводится по имени массива записей с указанием индекса в круглых скобках. Например, значение 2-й записи:

>> personal(2) ans =

surname: 'Darvin' data: [12 2 1809]

area : ' биология' disciples: 0

Значение поля в i-й записи выводится по имени массива записей с указанием индекса в круглых скобках и, после точки, имени поля. Например, значение поля surname первой записи:

>> personal(1).surname

 

ans =

 

Newton

Отформатировано: русский

 

Значения поля во всех записях выводятся по имени массива с указанием имени поля после точки. Например, значения поля surname:

>> personal.surname ans =

Newton ans = Darvin ans = Fourier

3.6. Массивы ячеек — cell array

Массив ячеек — это самый сложный нечисловой массив (табл. 1), элементами которого являются ячейки — массивы любой размерности, любого размера и типа.

Подобно матрице в линейной алгебре, матрица ячеек имеет строки и столбцы, и ее размер равен их произведению m × n.

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

фигурных скобках.

Сформируем матрицу ячеек A размером 2×3. Сначала сформируем ее элементы:

7

>> A1 =

[1 2 3 4;5 6 7 8];

% матрица типа double

>> A2 =

[true false true];

% вектор типа logical

>> A3

=

eps;

% скаляр типа double

>> A4

=

personal;

% массив записей

>> A5

=

[char('a','aaa') char(' bb',' b')];

% матрица символов

>> A6

=

int8([159.7 -115.7;-75.7 14.1]);

% матрица типа int8

а затем из них сформируем матрицу ячеек A:

>> A = {A1 A2 A3;A4

A5 A6}

 

A =

 

 

 

[2x4 double]

[1x3

logical]

[2.2204e-016]

[1x3 struct]

[2x6

char ]

[2x2 int8]

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

Вывод элементов массива ячеек выполняется по его имени с указанием индексов в

фигурных скобках:

>> A{1,2} ans =

1 0 1

>> A{2,1} ans =

1x3 struct array with fields: surname

data area disciples

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

помощью функции:

cellplot(A,'legend')

Рис. 2. Графическое представление матрицы ячеек

3.7. Определение типа массива

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

class(<имя переменной>)

Например, для рассмотренных выше переменных A2, A5 и A:

>> class(A2),class(A5),class(A)

ans =

logical

8

ans =

char

ans =

cell

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

возвращающими 1 (true), если аргумент, в круглых скобках соответствует объявленному типу, и 0 (false) — в противном случае. Имена этих функций начинаются с приставки "is …", что переводится как вопрос "является ли?":

isnumeric(<имя переменной>)

islogical(<имя переменной>) ischar(<имя переменной>)

isstruct(<имя переменной>) iscell(<имя переменной>)

Например, для рассмотренных выше переменных A5 и A:

>>isnumeric(A5) ans =

0

>>iscell(A)

ans =

1

3.8. Общие правила при выводе графиков

Огромное разнообразие графических средств системы MATLAB является одним из ее основных преимуществ перед другими пакетами программ (Лекция 1).

Прежде чем перейти собственно к построению графиков, познакомимся общими правилами при их выводе:

Текущий график выводится в текущее графическое окно Figure со стандартным меню и панелью инструментов.

Первый график выводится в окно Figure 1, а каждый следующий — в то же окно

с автоматическим удалением предыдущего графика.

Вывод графиков в отдельных графических окнах Figure 1, Figure 2, ... ,

выполняется с помощью функции:

figure

которая ставится перед выводом каждого следующего графика.

Присваивание имени текущему графическому окну Figure выполняется с помощью функции:

figure('Name','<Имя графика>','NumberTitle','off')

Вывод нескольких графиков на одних координатных осях в текущее графическое окно Figure выполняется по команде:

hold on

которая ставится перед выводом каждого следующего графика.

Удаление всех графиков из текущего графического окна Figure выполняется по команде:

hold off

9

которая ставится перед выводом нового графика (графиков) в данное окно.

Вывод нескольких независимых графиков в текущее графическое окно Figure

выполняется путем его разбиения на отдельные поля с помощью функции: subplot(m,n,p)

где m × n — размер матрицы графического окна: m строк и n столбцов; p —

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

3.9. Двумерная графика

Для построения графиков используются специальные функции, полная информация о которых дается в справочной системе MATLAB. После обращения к ней по команде главного меню Help | Product Help следует выбрать раздел MATLAB и в нем — раздел Graphics.

Двумерная графика предназначена для построения графиков в двумерном пространстве (на плоскости).

Начнем знакомство с двух "классических" функций построения графиков в декартовой системе координат:

1.Функция plot — для графиков функций y(x) , заданных в дискретных точках, с

линейной интерполяцией между соседними значениями: plot(x,y[,<параметры управления>])

где:

x, y — аргумент и функция y(x) (векторы или матрицы), согласованные по длине или размеру.

Если x, y — матрицы, то построение графиков выполняется по столбцам.

В отсутствие аргумента x аргументами служат индексы элементов вектора или столбцов матрицы.

<параметры управления> — необязательные параметры (признак необязательности — квадратные скобки), управляющие свойствами графиков, которые рассматриваются далее.

y(x)

Функцию plot можно использовать для построения графиков нескольких функций y1(x1 ) , y2 (x2 ) , …:

plot(x1,y1[,<параметры управления>],x2,y2[,<параметры управления>]...)

2.Функция stem — для графиков функций y(x) , заданных в дискретных точках, с

выводом значений в виде отсчетов с маркерами: stem(x,y[,'fill'] [,<параметры управления>])

Необязательный параметр 'fill' указывает на закрашивание маркеров.

Функцию stem используют для построения графиков последовательности чисел, которую коротко называют " последовательностью".

Прежде чем привести примеры построения графиков, познакомимся с общими правилами их оформления (табл.2).

 

Таблица 2. Функции оформления графиков

 

 

Функция

Назначение

 

 

grid

Нанесение координатной сетки

 

 

title('<текст>')

Заголовок графика

 

 

xlabel('<текст>')

Обозначение осей x, y

10

ylabel('<текст>')

xlim([xmin xmax])

Установка границ по осям x, y

ylim([ymin ymax])

legend('legend1','legend2',...) Размещение легенды в порядке вывода графиков

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

Используем функции plot и stem для построения графиков функций y = sin(x) и y = x на интервале x [0; 8π] с шагом x = π8 . Выведем графики в отдельные поля текущего графического окна с помощью функции subplot. Функция построения графика ставится после функции subplot через запятую, а функции оформления после функции построения графика через запятую или на отдельной строке:

>>x = 0:pi/8:8*pi;

>>y1 = sin(x); y2 = sqrt(x);

>>subplot(2,2,1), plot(x,y1), grid, ylabel('y1(x)')

>>title('y1(x) = sin(x) - plot')

>>subplot(2,2,2), stem(x,y1,'fill'), grid, ylabel('y1(x)')

>>title('y1(x) = sin(x) - stem')

>>subplot(2,2,3), plot(x,y2), grid, xlabel ('x'), ylabel('y2(x)')

>>title('y2(x) = sqrt(x) - plot')

>>subplot(2,2,4), stem(x,y2,'fill'), grid, xlabel ('x')

>>ylabel('y2(x)'), title('y2(x) = sqrt(x) - stem')

Выведенные графики представлены на рис. 3.

 

 

 

 

 

y1(x) = sin(x) - plot

 

 

 

y1(x) = sin(x) - stem

 

 

1

 

 

 

 

1

 

 

 

 

0.5

 

 

 

 

0.5

 

 

 

)

 

 

 

 

)

 

 

 

 

y 1(x

0

 

 

 

y 1(x

0

 

 

 

 

 

 

 

 

 

 

 

 

-0.5

 

 

 

 

-0.5

 

 

 

 

-1

 

 

 

 

-1

 

 

 

 

0

10

20

30

 

0

10

20

30

 

 

y2(x) = sqrt(x) - plot

 

 

 

y2(x) = sqrt(x) - stem

 

 

6

 

 

 

 

6

 

 

 

 

4

 

 

 

 

4

 

 

 

 

y 2(x )

 

 

 

 

y 2(x )

 

 

 

 

2

 

 

 

 

2

 

 

 

 

0

 

 

 

 

0

 

 

 

 

0

10

20

30

 

0

10

20

30

 

 

 

x

 

 

 

 

x

 

Рис. 3. Графики, построенные с помощью функций plot и stem

Построим графики функций y = sin(x) и y = x с помощью функции plot и

выведем их на одних координатных осях с размещением легенды (рис. 4):

>> figure

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]