Задание матриц
Выражения
Формируются по обычным правилам, принятым в программировании на языках высокого уровня.
Для задания некоторых матриц стандартного вида в систему 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 =
>> M(6)
ans =
>> M(8)
ans =
Оператор «:».
Этот оператор играет весьма важную роль в системе и очень широко используется в различных формах для упрощения ряда манипуляций с матрицами.
В частности запись 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 =
Выполним другой пример:
>> 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 =
При выводе на экран собственных значений матриц, имеющих большие размерности, желательно выполнить их сортировку. Это можно сделать с помощью функции 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. Задать в рабочем пространстве две случайные матрицы размером 3´2 и 2´3. Из полученной матрицы выделить верхний диагональный блок размера 2´2. Найти определитель произведения двух матриц.
|
|
2. Задать случайный вектор-столбец a и случайную вектор-строку b. Найти два произведения ab и ba. Найти определитель первого из них.
3. Задать произвольную матрицу A размера 5´3 и произвольную матрицу B размера 2´3. Сформировать блочную матрицу . Выделить её пятый столбец.
4. Сформировать случайную матрицу размера 6´3. Выделить её верхний диагональный блок размера 3´3 и найти его определитель. Если определитель отличен от нуля, обратить найденный блок. Доказать, что обращение осуществлено правильно.
5. Сформировать случайную матрицу размера 3´5. Выделить её верхний диагональный блок размера 3´3 и найти его определитель. Изменить первую строку так, чтобы определитель заведомо обратился в нуль. Проверить величину определителя
6. Построить случайную квадратную матрицу размера 20´20 и найти её собственные значения, отсортировать их и записать в вектор b.
7. Задать произвольную матрицу размером 4´4. Найти все её собственные значения и соответствующие им собственные векторы. Проверить все найденные пары на соответствие.