1.2. Элементарные операции с матрицами
Представление чисел
Числа в MATLAB могут быть целыми, дробными, с фиксированной и плавающей точкой. Ниже приведены примеры представления чисел:
1
-2
4.321
0.000000001
987.6543е-21
-123.567е10
Числа могут быть комплексными. В MATLAB мнимая единица ( ) обозначается как i или j. Пример комплексных чисел:
3i
2+4i
-5.4321i
-123.45+1.2e-4i
Команда format управляет формой вывода чисел на экран. Особо подчеркнем, что эта команда влияет только на то, как числа изображаются на экране, но никак не влияет на точность вычислений и на представление чисел в рабочем пространстве системы MATLAB. Ниже приведен пример представления числового вектора в различных форматах:
>> х = [4/3 1.2345е-6];
>> format short
>> x
x = 1.3333 0.0000
>> format short e 1.3333e+000 1.2345e-006
>> format short g 1.3333 1.2345e-006 format long
1.33333333333333 0.00000123450000 Format long e
1.333333333333333e+000 1.234500000000000e-006
format long g
1.33333333333333 1.2345e-006
format bank
1.33 0.00
format rat
4/3 1/810045
format hex
3Ff5555555555555 3eb4b6231abfd271
Переменные
Система MATLAB выполняет различные действия над переменными, каждая из которых имеет некоторое имя. Имена назначаются пользователем или системой и формируются как произвольные последовательности латинских букв и цифр (допустим также символ подчеркивания), начинающиеся обязательно с буквы. При этом система различает прописные и строчные буквы. Указание имени новой переменной в левой части оператора присваивания приводит к её автоматическому размещению в оперативной памяти, трактуемой в среде как «рабочее пространство» (WorkSpace). Удалить переменную из рабочего пространства можно только с помощью команды clear.
Системные переменные
В системе по умолчанию определены некоторые часто используемые переменные, основными из которых являются следующие:
i или j – мнимая единица ;
pi – число =3.141592653589793…;
eps – погрешность для операций над числами с плавающей точкой (возвращает расстояние (интервал) между числом 1.0 и следующим ближайшим числом с плавающей запятой, которое воспринимается как отличное от 1.0);
inf – значение машинной бесконечности;
ans – переменная, в которой хранится результат выполнения последней операции (создается автоматически, когда не определены выходные аргументы какой-либо команды);
NaN – указание на нечисловой характер данных (Not-a-Number);
Для очистки рабочего пространства используются следующие варианты команды clear:
clear – уничтожение всех переменных;
clear x – уничтожение переменной x;
clear a, b, c – уничтожение нескольких указанных переменных.
Система MATLAB позволяет сохранять переменные в файлах. Для этого предназначена команда save, которая может использоваться в следующих формах:
save fname – записываются все переменные из рабочего пространства в двоичный файл с именем fname.mat;
save fname X – в указанный файл записывается только переменная X;
save fname X Y Z – записываются переменные X, Y, Z.
Также можно указывать ключи, уточняющие формат записи:
-mat – двоичный mat-файл, используемый по умолчанию;
-ascii – ASCII-формат обычной точности (8 цифр) для записи в текстовый файл;
-ascii -double – ASCII-формат двойной точности (16 цифр);
-ascii -double -tabs – формат с разделителями и метками табуляции;
-v4 – запись в mat-файл в формате версии MATLAB 4;
-append – добавление в существующий файл.
Для загрузки рабочей области, ранее сохраненной командой save, можно использовать команду load:
load fname – загрузка ранее сохраненных в файле fname.mat переменных.
Выражения
Формируются по обычным правилам, принятым в программировании на языках высокого уровня.
Задание матриц
Для задания некоторых матриц стандартного вида в систему Matlab включены соответствующие функции.
1. Нулевая матрица размера задается функцией zeros(n,m), например:
>> Z = zeros(2,4)
Z =
0 0 0 0
0 0 0 0
2. Единичная матрица размера задается функцией eye(n,n), например:
>> I = eye(2,2)
I =
1 0
0 1
3. Для задания матрицы размера , все компоненты которой равны единице, служит функция ones(n,m), например:
>> N = ones(2,2)
I =
1 1
1 1
4. Матрица размера , со случайными компонентами, которые равномерно распределены на отрезке [0,1], задается функцией rand(n,m), например:
>> R=rand(2,3)
R =
0.4565 0.8214 0.6154
0.0185 0.4447 0.7919
5. Матрица – магический квадрат размера – задается функцией magic(n), например:
>> M=magic(3)
M =
8 1 6
3 5 7
4 9 22
Любые другие матрицы вводятся вручную или вызываются из файлов на диске.
Если надо задать вектор из трех элементов, то их значения следует перечислить в квадратных скобках, разделяя пробелами или запятыми. Например, команда
V=[1 2 3];
задает вектор-строку V, имеющую три элемента со значениями 1, 2 и 3.
Задание матрицы требует указания нескольких строк. Для разделения строк используется точка с запятой (;). Например, команда
>> M=[1 2 3; 4 5 6; 7 8 9]
M =
1 2 3
4 5 6
7 8 9
определяет матрицу 3х3.
Совершенно аналогично с использованием символа разделения строк задаются блочные матрицы. Например, сформируем блочную матрицу , где – магический квадрат размера . Для этого подадим следующие команды:
>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2
>> E=eye(3,3)
E =
1 0 0
0 1 0
0 0 1
>> Z=zeros(3)
Z =
0 0 0
0 0 0
0 0 0
>> B=[A E; Z A']
B =
8 1 6 1 0 0
3 5 7 0 1 0
4 9 2 0 0 1
0 0 0 8 3 4
0 0 0 1 5 9
0 0 0 6 7 2
Для указания отдельной компоненты вектора или матрицы используются выражения вида V(i) или M(i, j). Если для матрицы указать только один индекс, то в результате будет получен соответствующий элемент блочного вектора, составленного из столбцов данной матрицы. Например,
>> M=[1 2 3; 4 5 6; 7 8 9]
M =
1 2 3
4 5 6
7 8 9
>> M(2)
ans =
4
>> M(6)
ans =
8
>> M(8)
ans =
6
Оператор «:».
Этот оператор играет весьма важную роль в системе и очень широко используется в различных формах для упрощения ряда манипуляций с матрицами.
В частности запись 1:10 является вектором-строкой, содержащей целые числа от 1 до 10: 1 2 3 4 5 6 7 8 9 10. Для формирования аналогичного вектора с шагом, отличным от единицы, применяют, например, такую запись: 5:-2:-3, что эквивалентно вектору 5 3 1 -1 -3.
Рассматриваемый оператор особенно удобно использовать для выделения отдельных блоков из состава заданной матрицы. В частности, запись A(1:6,j) выделяет первые шесть элементов из j-го столбца матрицы A, запись A(1:2,1:3) выделяет верхний блок размера 2×3, а запись A(4,:) – четвёртую строку этой матрицы. Например,
>> A=rand(5,5)
A =
0.9501 0.7621 0.6154 0.4057 0.0579
0.2311 0.4565 0.7919 0.9355 0.3529
0.6068 0.0185 0.9218 0.9169 0.8132
0.4860 0.8214 0.7382 0.4103 0.0099
0.8913 0.4447 0.1763 0.8936 0.1389
>> B=A(1:3,1:3)
B =
0.9501 0.7621 0.6154
0.2311 0.4565 0.7919
0.6068 0.0185 0.9218
>> C=B(:,3)
C =
0.6154
0.7919
0.9218
При возникновении необходимости удаления отдельных строк или столбцов матрицы, используются пустые квадратные скобки. Допустим, мы хотим удалить вторую строку матрицы M, что можно сделать командой:
>> M(2,:)=[]
M =
1 2 3
7 8 9
А теперь, удалим второй столбец:
>> M(:,2)=[]
M =
1 3
7 9
Простейшие операции с матрицами
Операция транспонирования матрицы выполняется с использованием символа «'»:
>> A=rand(2)
A =
0.2028 0.6038
0.1987 0.2722
>> B=A'
B =
0.2028 0.1987
0.6038 0.2722
Операции сложения, умножения и обращения матриц выполняются в соответствии с обычными правилами линейной алгебры в естественной форме записи.
Например,
>> A=rand(2,2)
A =
0.9501 0.6068
0.2311 0.4860
>> B=rand(2,2)
B =
0.8913 0.4565
0.7621 0.0185
>> C=A+B
C =
1.8414 1.0633
0.9932 0.5045
>> D=A*B
D =
1.3093 0.4449
0.5764 0.1145
Складывать и вычитать можно только матрицы одинаковой размерности. При перемножении двух матриц их размерности должны быть согласованы: число столбцов первого сомножителя должно быть равно числу строк второго.
Обращать можно только не особые (невырожденные) матрицы, определитель которых отличен от нуля. Для вычисления определителя используется команда (функция) det:
>> det(D)
ans =
-0.1065
Операция обращения матрицы выполняется с помощью возведения в -1-ю степень или с помощью команды inv:
>> A^-1
ans =
1.5117 -1.8876
-0.7190 2.9555
>> inv(A)
ans =
1.5117 -1.8876
-0.7190 2.9555
Поиск собственных значений и собственных векторов. Эта операция нами будет очень часто использоваться в дальнейшем, в особенности – в части поиска собственных значений матриц, которые в значительной мере определяют свойства линейных динамических объектов.
Для выполнения операции используется функция eig, применяемая в нескольких вариантах, среди которых рассмотрим два простейших.
1. Поиск только собственных значений квадратной матрицы A выполняется командой e=eig(A), где e – вектор с комплексными компонентами, содержащий искомые значения, например,
>> A=diag([1 2 3 4 5])
A =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
>> e=eig(A)
e =
1
2
3
4
5
Выполним другой пример:
>> A = rand(5);
>> e=eig(A)
e =
2.8043
-0.0490 + 0.5617i
-0.0490 - 0.5617i
0.2093
-0.0381
2. Одновременный поиск собственных значений и собственных векторов квадратной матрицы A выполняется с помощью команды [V,D]=eig(A), где D – диагональная матрица, содержащая собственные значения, а V – матрица, столбцами которой являются соответствующие им собственные векторы. При этом, по определению, выполняется равенство AV=VD, например,
>> A=rand(2)
A =
0.3795 0.5028
0.8318 0.7095
>> [V,D]=eig(A)
V =
-0.7074 -0.5170
0.7068 -0.8560
D =
-0.1230 0
0 1.2119
>> A*V
ans =
0.0870 -0.6266
-0.0869 -1.0373
>> V*D
ans =
0.0870 -0.6266
-0.0869 -1.0373
Заметим, что собственные векторы выдаются в нормированном виде – их евклидовы нормы – единичные:
>> norm(V(:,2))
ans =
1
При выводе на экран собственных значений матриц, имеющих большие размерности, желательно выполнить их сортировку. Это можно сделать с помощью функции sort(e), которая располагает компоненты комплексного вектора e в порядке возрастания их модулей. Эту функцию удобно совмещать с функцией eig, подавая для вычисления собственных значений команду d=sort(eig(A)), например
>> A=rand(10);
>> e=sort(eig(A))
e =
-0.0474 - 0.1567i
-0.0474 + 0.1567i
0.2441
0.2689 - 0.4137i
0.2689 + 0.4137i
-0.3356 - 0.5869i
-0.3356 + 0.5869i
-0.4176 - 0.7707i
-0.4176 + 0.7707i
4.9579
Подробную справку по операциям с матрицами можно получить, подавая команды help elmat и help matfun.
Задание для самостоятельной работы:
1. Задать в рабочем пространстве две случайные матрицы размером 32 и 23. Из полученной матрицы выделить верхний диагональный блок размера 22. Найти определитель произведения двух матриц.
2. Задать случайный вектор-столбец a и случайную вектор-строку b. Найти два произведения ab и ba. Найти определитель первого из них.
3. Задать произвольную матрицу A размера 53 и произвольную матрицу B размера 23. Сформировать блочную матрицу . Выделить её пятый столбец.
4. Сформировать случайную матрицу размера 63. Выделить её верхний диагональный блок размера 33 и найти его определитель. Если определитель отличен от нуля, обратить найденный блок. Доказать, что обращение осуществлено правильно.
5. Сформировать случайную матрицу размера 35. Выделить её верхний диагональный блок размера 33 и найти его определитель. Изменить первую строку так, чтобы определитель заведомо обратился в нуль. Проверить величину определителя
6. Построить случайную квадратную матрицу размера 2020 и найти её собственные значения, отсортировать их и записать в вектор b.
7. Задать произвольную матрицу размером 44. Найти все её собственные значения и соответствующие им собственные векторы. Проверить все найденные пары на соответствие.