cat объединяет матрицы вдоль трех направлений:
cat(направление, матрица_1, матрица_2,…,матрица_n)
Параметр направление может принимать значение 1, что соответствует объединению по вертикали, 2 – горизонтали, 3 – объединить вдоль третьей оси.
Пример 27. Объединение матриц по горизонтали clear, clc
% Задание матриц
M1=[1 2; 3 4], M2=[5 6 7; 8 9 10]
% Объединение по горизонтали с помощью
% квадратных скобок
[M1 M2]
% Объединение по горизонтали с помощью функции cat cat(2,M1,M2)
Пример 28. Объединение матриц по вертикали clear, clc
% Задание матриц
22
M3=[1 2 3], M4=[5 6 7; 8 9 10]
% Объединение по горизонтали с помощью
% квадратных скобок
[M3; M4]
% Объединение по горизонтали с помощью функции cat cat(1,M3,M4)
Пример 29. Объединение матриц вдоль третьей оси clear, clc
% Задание матриц
M5=[1 2; 3 4], M6=[5 6; 8 9]
% Сложение в «стопку» с помощью функции cat cat(3,M5,M6)
С помощью функции inv и операции возведения в степень -1 можно найти обратную матрицу.
Пример 30. Нахождение обратной матрицы
A=[1 2; 0 2] inv(A)
A^(-1)
Часто используемые матричные функции
Рассмотрим некоторые часто применяемые матричные функции, такие как sum, prod, diag, fliplr, rot90, reshape, repmat,
blkdiag.
Пример 31. Сумма по столбцам clear clc
A=[1 2; 3 4] sum(A)
При исполнении примера #31, получим результат – два числа 4 и 6, что соответствует суммам элементов в столбцах. Чтобы получить суммирование
23 по строкам, необходимо указать второй параметр в функции
sum, а именно
2.
Пример 32. Сумма по строкам clear, clc
A=[1 2; 3 4] sum(A,2)
Пример 33. Сумма всех элементов матрицы clear, clc
A=[1 2; 3 4] sum(sum(A))
Чтобы найти произведение элементов матрицы, используйте функцию prod.
Пример 34. Произведение элементов матрицы clear, clc
A=[1 2; 3 4] prod(A) prod(A,2) prod(prod(A))
Функция
diag позволяет выделить диагонали матрицы, если аргумент функции – матрица, либо построить матрицу с заданной диагональю, если аргумент - вектор.
Пример 35. Выделение диагоналей матрицы clear, clc
A=[1 2 3; 1 2 3; 1 2 3]
% Выделение главной диагонали diag(A)
%
Выделение побочной диагонали, расположенной ниже главной diag(A,-1)
% Выделение побочной диагонали, расположенной выше главной diag(A,1)
24
Пример 36. Построение матрицы на основе заданной диагонали clear, clc d1=[1 2 3]
% элементы d1 будут располагаться на главной диагонали diag(d1)
% элементы d1 будут располагаться ниже
% главной диагонали diag(d1(2:3),-1)
% элементы d1 будут располагаться выше
% главной диагонали diag(d1(2:3),1)
Функции fliplr и rot90 позволяют отражать и поворачивать векторы и матрицы. Покажем их работу на примере.
Пример 37. Функции fliplr и rot90 clc, clear d1=[1 2 3],d2=[11 12 13] rot90(d1) fliplr(d2) a1=[10 2 3; 40 5 6; 70 8 9] fliplr(a1) a2=[10 20 30; 4 5 6; 7 8 9] rot90(a2)
С помощью функции reshape можно изменить форму – размерность массива, количество элементов массива при этом остается неизменным.
Пример 38. Функция reshape clc, clear d=1:12 size(d) d=reshape(d,3,4) size(d) d=reshape(d,4,[]) size(d)
25 d=reshape(d,12,1) size(d)
Функция repmat позволяет задавать новую матрицу с помощью реплициро- вания (повторения) исходной матрицы в соответствии с заданной размерно- стью.
Пример 39. Функция repmat d=1:3 d1=repmat(d,2), d2=repmat(d,2,3)
С помощью функции blkdiag выполняют построение блочно-диагональных матриц, а с помощью функции spy можно отобразить структуру матрицы, её ненулевые элементы.
Пример 40. Функция blkdiag clc, clear m1=[1 2; 3 4], m2=[10 20 30; 40 50 60], m3=[2 4 6; 1 3 7; 5 4 3]
% Формирование блочно-диагональной матрицы m=blkdiag(m1,m2,m3)
% Визуализация структуры матрицы spy(m)
В некоторых примерах, приведенных выше, использовалась функция size, возвращающая количество строк и количество столбцов объекта. Функция
numel возвращает общее количество элементов массива, а функция
length – количество элементов вектора или строки матрицы.
Пример 41. Функции size, numel, length clc, clear v1=[1; 2; 3; 4], v2=[1 2 3 4] size(v1), size(v2) length(v1),length(v2) numel(v1),numel(v2)
M=[1 2 3; 4 5 6] size(M), length(M), numel(M)
26
Логические операции с матрицами
Для матриц определены логические операции:
Операция
Знак операции
Равно
==
Не равно
=
Больше
>
Больше или равно
>=
Меньше
<
Меньше или равно
<=
Логическое И
&
Логическое ИЛИ
|
Пример 42. Подсчет количества элементов матрицы, равных двум clc, clear
A=[1 2; 3 2] sum(sum(A==2))
Пример 43. Подсчет количества одинаковых элементов в матрицах A и B и стоящих на одинаковых местах clc, clear
A=[1 2; 3 2]
B=[1 0; 3 5] sum(sum(A==B))
27
Задачи для самостоятельного решения
Вариант 1 1. Задана матрица A=randi(*-5 5],3,3) a) Определить количество ненулевых элементов. b) Найти A+A', показать, что полученная матрица симметричная. c) Определить количество элементов, равных двум. d) Переставить верхнюю и нижнюю строки матрицы. e) Найти сумму элементов главной диагонали матрицы.
2. Заданы 5 матриц различного порядка. Создать блочно-диагональную матрицу, состоящую из заданных матриц-блоков. Отобразить структуру полученной матрицы с помощью spy.
3. Заданы матрицы одинаковой размерности:
A= randi([-5 5],3,3), B= randi([-5 5],3,3) a) Определить количество позиций, на которых стоят ненулевые элементы в обеих матрицах. b) Определить количество позиций, на которых, хотя бы в одной из матриц стоят ненулевые элементы.
4. Задан вектор x=1:9. Получить из него матрицу 3-го порядка, в каждой строке которой записаны последовательно элементы вектора.
5. Задан вектор x=1:4. Создать матрицу 4-го порядка, элементы каждой строки (столбца) матрицы являются элементами вектора.
6. Задано целое число n и целочисленный вектор. Повторить каждый элемент вектора n раз.
7. Задан вектор, в котором есть нулевые элементы. Каждый нулевой элемент заменить средним арифметическим элементов вектора.
28
Вариант 2 1. Задана матрица A=randi(*-5 5],3,3) a) Определить количество нулевых элементов. b) Проверить – является ли матрица симметричной. c) Определить количество элементов, неравных двум. d) Переставить правый и левый столбцы матрицы. e) Найти сумму элементов побочной диагонали матрицы.
2. Заданы 5 матриц различного порядка. Создать блочно-диагональную
матрицу из заданных матриц-блоков, блоки расположить вдоль побочной диагонали. Отобразить структуру полученной матрицы с помощью spy.
3. Заданы матрицы одинаковой размерности:
A= randi([-5 5],3,3), B= randi([-5 5],3,3) a) Определить количество позиций, на которых стоят элементы, равные двум в обеих матрицах. b) Определить количество позиций, на которых, хотя бы в одной из матриц стоят элементы, равные двум.
4. Задан вектор x=1:9. Получить из него матрицу 3-го порядка, в каждом столбце которого записаны последовательно элементы вектора.
5. Задан вектор x=1:4. Создать матрицу 4-го порядка, на диагоналях которой стояли бы элементы вектора. Если диагональ короче size(x), то заполнение начинать 1-го элемента вектора x.
6. Задано целое число n и целочисленный вектор. Повторить каждый элемент вектора n раз.
7. Задан вектор, в котором есть нулевые элементы. Каждый нулевой элемент заменить максимальным среди элементов вектора.
29
Вариант 3 1. Задана матрица A=randi(*-5 5],3,3) a) Определить количество отрицательных элементов. b) Проверить – является ли матрица кососимметричной. c) Определить количество элементов, равных минус единице. d) Переставить местами главную и побочную диагонали матрицы. e)
Найти сумму элементов, стоящих выше главной диагонали.
2. Заданы 5 матриц различного порядка. Создать матрицу из заданных матриц-блоков, блоки расположить в углах матрицы. Отобразить структуру полученной матрицы с помощью spy.
3. Заданы матрицы одинаковой размерности:
A= randi([-5 5],3,3), B= randi([-5 5],3,3) a) Определить количество позиций, на которых стоят элементы, равные максимальному значению матрицы, в обеих матрицах. b) Определить количество позиций, на которых, хотя бы в одной из матриц стоят максимальные элементы.
4. Задан вектор x=1:16. Получить из него матрицу 4-го порядка, в каждом столбце которого записаны последовательно элементы вектора.
5. Задан вектор x=1:3. Создать матрицу 3-го порядка, на диагоналях которой стояли бы элементы вектора. Если диагональ короче size(x), то заполнение начинать 1-го элемента вектора x.
6. Задано целое число n и целочисленный вектор. Повторить каждый элемент вектора n раз.
7. Задан вектор, в котором есть ненулевые элементы. Каждый ненулевой элемент заменить минимальным среди элементов вектора.
30
Вариант 4 1. Задана матрица A=randi(*-5 5],3,3) a) Определить количество элементов, равных 3. b) Проверить – является ли матрица положительноопрделенной. c) Определить количество неотрицательных элементов. d) Переставить угловые элементы матрицы. e) Найти сумму элементов, стоящих ниже главной диагонали.
2. Заданы 5 матриц различного порядка. Создать матрицу из заданных матриц-блоков, блоки расположить вдоль 1-й строки матрицы. Отобразить структуру полученной матрицы с помощью spy.
3. Заданы матрицы одинаковой размерности:
A= randi([-5 5],3,3), B= randi([-5 5],3,3) a) Определить количество позиций, на которых стоят элементы, равные максимальному отрицательному элементу матрицы, в обеих матрицах. b) Определить количество позиций, на которых, хотя бы в одной из матриц стоят максимальные отрицательные элементы.
4. Задан вектор x=1:16. Получить из него матрицу 4-го порядка, в каждой строке которой записаны последовательно элементы вектора.
5. Задан вектор x=1:3. Создать матрицу 3-го порядка, на диагоналях которой стояли бы элементы вектора. Если диагональ короче size(x), то заполнение начинать 1-го элемента вектора x.
6. Задано целое число n и целочисленный вектор. Повторить каждый элемент вектора n раз.
7. Задан вектор, в котором есть ненулевые элементы. Каждый ненулевой элемент заменить средним значение среди элементов вектора.
31
Графика в MatLab
Система MATLAB предоставляет огромное количество графических средств. К ним относятся команды построения простых графиков функций, комбинированные и презентационные графики, элементы анимации и сред- ства проектирования графического пользовательского интерфейса (GUI).
Построение графиков функций
Рассмотрим на примерах способы построения графиков в ML. Если заданы два вектора одинакового размера, хранящие координаты функции, то построить график функции можно с помощью команды plot.
Пример 1. Построение графика функции
% задание вектора x x = [0:0.005:5];
% расчет значений функции y = exp(-x).*sin(10*x);
% построение графика функции plot(x, y)
Графическое окно пакета MatLab
32
После выполнения скрипта из примера #1 на экране возникнет графическое окно, выполняя команды меню этого графического окна File→Save as,
File
Export Setup, можно сохранить построенный график в файл MatLab с расширением fig, либо экспортировать в графические форматы - png, eps, gif.
Файл с расширением fig можно открыть в MatLab. Результатом открытия файла будет графическое окно.
Несколько графиков в одном графическом окне
Для того, чтобы построить еще один график в этом же графическом окне, то можно действовать двумя путями – воспользоваться командой hold on, либо добавить еще два аргумента в команду plot. С помощью функции delete производят удаление графика.
Пример 2. Два графика функции в одних осях с помощью hold on x = [0:0.005:5]; y1 = exp(-x).*sin(10*x); y2 = exp(-x).*cos(10*x);
% построение первого графика функции plot(x, y1)
% продолжать построение в этом же окне hold on
% построение второго графика функции plot(x, y2)
Пример 3. Два графика функции в одних осях с помощью plot x = [0:0.005:5]; y1 = exp(-x).*sin(10*x); y2 = exp(-x).*cos(10*x);
% построение сразу двух графиков функций plot(x, y1, x, y2)
33
Установка параметров графиков
Задать цвет и тип линии для графиков можно несколькими способа- ми. Рассмотрим один из этих способов на примере.
Пример 4. Задание цвета и типа линии для графика x = [0:0.005:5]; y = exp(-x).*sin(10*x); plot(x, y,
'r:'
)
Обозначения для типа линий, цветов и маркеров приведены в таблице ниже.
Цвет
Y
Желтый
M
Розовый
C
Голубой
R
Красный
G
Зеленый
B
Синий
W
Белый
K
Черный
Линия
-
Сплошная
:
Пунктирная
-.
штрих-пунктирная
--
Штриховая
Маркер
Точка o
Кружок х
Крестик
+ знак "плюс"
* звездочка s
Квадрат d
Ромб v
Треугольник вершиной вниз
^
Треугольник вершиной вверх
<
Треугольник вершиной влево
> треугольник вершиной вправо
P пятиконечная звезда
H шестиконечная звезда
Иногда необходимо создать несколько графических окон одновре- менно. В этом случае нужно использовать команду figure без параметров, или задать в качестве параметра целое число, соответствующее номеру окна.
Заголовок для графического окна задается с помощью функции title, ее параметром является текстовая строка.
34
Если заголовок используется не так часто - обычно его заменяет под- рисуночная подпись, то использование легенды - legend всегда целесооб- разно, когда в одних осях отображается более одного графика.
Легенда позволяет определить взаимное соответствие графиков и функций. Для каждого из графиков в качестве параметров функции legend используют текстовую строку, описывающую соответствующий график. По- следний необязательный аргумент определяет положение легенды в графи- ческом окне. Также положение легенды можно менять уже после построе- ния графика с помощью перетаскивания.
Расположение легенды
-1 вне графика в правом верхнем углу графического окна
0 лучшее положение в пределах графика так, чтобы как можно мень- ше перекрывать сами графики
1 в верхнем правом углу графика (это положение используется по умолчанию)
2 в верхнем левом углу графика
3 в нижнем левом углу графика
4 в нижнем правом углу графика
Поименование осей осуществляется посредством функций xlabel и
ylabel. Обратите внимание на то, что дополнительные параметры для гра- фических осей устанавливаются, когда оси уже созданы, то есть после ко- манды plot.
Пример 5. Использование легенды и подписи осей
% создание графического окна figure x = [0:0.005:5]; y1 = exp(-x).*sin(10*x); y2 = sin(10*x);
% построение графиков двух функций plot(x, y1,
'k-'
,x,y2,
'k:'
)
35
% создание легенды legend(
'y1=exp(-x)*sin(10*x)'
,
'y2=sin(10*x)'
,4)
% создание подписей к осям xlabel(
'x'
) ylabel(
'y'
)
Использование легенды и подписи осей.
Построение графика неявно заданной функции
Кроме рассмотренной функции plot есть и другие, выполняющие по- строение графиков. Например, с помощью ezplot можно построить график, как явной функции, так и неявно заданной функции. По умолчанию функция
ezplot выполняет построение графика на отрезке *-2Pi, 2Pi+. В качестве первого аргумента этой функции необходимо задать текстовую строку – вы- ражение для функции. Вторым аргументом может быть отрезок, на котором выполняется построение функции.
36
Пример 6. Использование функции ezplot
% построение графика
сердечной функции, заданной неявно ezplot(
'x^2+(y-abs(x)^(1/2))^2=1'
)
% построение графика функции, заданной явно
% c заданием отрезка, на котором выполняется построение ezplot(
'sin(x)'
,[0 pi])
Задать максимальное и минимальное значение для осей можно с помощью функции
axis([xmin xmax, ymin ymax]) Это
бывает необходимо, когда нужно расширить область осей, например, для расположения поясняющего текста. В примере 7 можно увидеть исполь- зование функций
axis и
text. Последняя Функция позволяет поместить в графические оси текстовую надпись. Ее аргументами являются координаты начала размещения текстовой строки и сама надпись.
Использование функций axis и text.
37
Пример 7. Использование функций axis и text ezplot(
'sin(x)'
) axis([0 pi 0 1.4]) text(0.25, 1.2,…
'Этот пример показывает использование функций text и axis'
)
Создание нескольких графических окон
Пример #8 соответствует случаю, когда в одном окне figure разме- щается несколько графических окон для визуализации графиков функций (а, вообще говоря, любой графической информации).
Использование функции subplot.
38
Структура таких окон и выбор активного окна осуществляются проце- дурой subplot. Первый и второй аргументы subplot задают матричную структуру окон-осей, их количество по строкам и столбцам, а третий аргумент
– номер активных осей. Здесь выбираются графики функций, заданных па- раметрически.
Пример 8. Использование функции subplot
% Гипоциклоиды clear, clc
% Задание вектора-параметра t t=0:0.001:8*pi;
% Данные и вектора для 1-го окна subplot k=5; x11=(k-1)*(cos(t)+cos((k-1)*t)/(k-1)); y11=(k-1)*(sin(t)-sin((k-1)*t)/(k-1)); x12=k*cos(t); y12=k*sin(t);
% Данные и вектора для 2-го окна subplot k=5.5; x21=(k-1)*(cos(t)+cos((k-1)*t)/(k-1)); y21=(k-1)*(sin(t)-sin((k-1)*t)/(k-1)); x22=k*cos(t); y22=k*sin(t);
% Данные и вектора для 3-го окна subplot k=6; x31=(k-1)*(cos(t)+cos((k-1)*t)/(k-1)); y31=(k-1)*(sin(t)-sin((k-1)*t)/(k-1)); x32=k*cos(t); y32=k*sin(t);
% Данные и вектора для 4-го окна subplot k=3.6; x41=(k-1)*(cos(t)+cos((k-1)*t)/(k-1)); y41=(k-1)*(sin(t)-sin((k-1)*t)/(k-1)); x42=k*cos(t); y42=k*sin(t);
% Построение графиков в 1-м окне subplot
39 subplot(2,2,1) plot(x11,y11,x12,y12) legend(
'k=5'
)
% Построение графиков во 2-м окне subplot subplot(2,2,2) plot(x21,y21,x22,y22) legend(
'k=5.5'
)
% Построение графиков в 3-м окне subplot subplot(2,2,3) plot(x31,y31,x32,y32) legend(
'k=6'
)
% Построение графиков в 4-м окне subplot subplot(2,2,4) plot(x41,y41,x42,y42) legend(
'k=3.6'
)
Использование логарифмической шкалы
Следующие примеры охватывают случаи, когда для одной или обеих осей стоит выбрать логарифмический масштаб, для больших диапазонов значений или для зависимостей логарифмического типа. Функции, которые строят графики в логарифмическом масштабе, это: