MATLAB имеет несколько функций, которые позволяют формировать векторы и матрицы определенного (специального) вида. Ниже приведены некоторые из этих функций:
zeros(M, N) − создает матрицу размером (M×N) с нулевыми элементами:
>> zeros(4,5)
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
ones(M, N) − то же самое − с единичными элементами:
>> ones(4, 5)
ans =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
eye(M,N) − создает матрицу размером (M×N) с единичными элементами по главной диагонали и остальными нулевыми элементами:
>> eye(4, 5)
ans =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
Замечание: При формировании квадратных матриц записи данных функций допускают упрощения: zeros(N), ones(N), eye(N). Если необходимо формировать специальные матрицы по размеру заданной матрицы А порядка (M×N), то возможна форма записи: zeros(size(A)), ones(size(A)), eye(size(A)). Нулевой вектор столбец задается с помощью функции zeros(N, 1), а нулевая вектор-строка − с помощью функции zeros(1, N). Аналогичным образом для создания соответствующих векторов используются функции ones и eye.
Рассмотрим еще несколько полезных команд:
rand(M,N) −создает матрицу размером (M×N) из случайных чисел, равномерно распределенных в диапазоне от 0 до 1:
>> rand(3, 5)
ans =
0.4175 0.9304 0.0920 0.7012 0.2625 0.6868 0.8462 0.6539 0.9103 0.0475 0.5890 0.5269 0.4160 0.7622 0.7361
randn(M,N) − создает матрицу размером (M×N) из случайных чисел, распределенных по нормальному закону с нулевым математическим ожиданием и стандартным (среднеквадратическим) отклонением, равным единице:
>> randn(3, 5)
ans =
1.1650 0.3516 0.0591 0.8717 1.2460 0.6268 ‐0.6965 1.7971 ‐1.4462 ‐0.6390 0.0751 1.6961 0.2641 ‐0.7012 0.5774
Одна из интересных возможностей MATLAB − вычисление магического квадрата (функция magic). По команде magic(N) возвращается матрица размером (N×N), состоящая из целых чисел от 1 до N^2, в которой суммы элементов по строкам, столбцам, главной и побочной диагоналям, соответственно, равны одному и тому же числу. При N = 2 построение магического квадрата невозможно. Пример:
>> M = magic(4)
M =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Следующие функции hadamard(N), hilb(N), invhilb(N), pascal(N) − создают квадратные матрицы соответственно Адамара, Гильберта, обратную матрицу Гильберта и матрицу Паскаля размера (N×N). О работе данных функций можно узнать в справочной библиотеке MATLAB.
>> X = [1; 2; 3] >> X = [1 2 3]
X = X =
1 1
2 2
3 3
Применение знака : (двоеточие) для формирования векторов. Оператор : (двоеточие) используется в MATLAB для различных целей. В частности, он позволяет генерировать числовые последовательности, необходимые для создания векторов или значений абсциссы при построении графиков. Общая форма задания такой последовательности имеет вид:
<начальное значение>:<шаг>:<конечное значение>
Шаг может быть как положительным, так и отрицательным. При шаге равном 1 он может опускаться в записи последовательности, в результате чего выше приведенная конструкция принимает более упрощенный вид:
<начальное значение>:<конечное значение>
Примеры:
>> 1:6
ans =
1 2 3 4 5 6
>> i = 0:2:10
i =
0 2 4 6 8 10
>> j = 10:‐1:4
j =
10 9 8 7 6 5 4
Задание матрицы требует указания различных строк. Для различения строк используется знак «;» (точка с запятой). Например:
>> M = [1 2 3; 4 5 6; 7 8 9]
M =
1 2 3
4 5 6
7 8 9
Возможен ввод элементов матриц и векторов в виде арифметических выражений, содержащих любые допустимые системе функции.
>> p=[2+3/4 exp(-5);sqrt(10) 2.1*sin(3)]
p =
2.7500 0.0067
3.1623 0.2964
Для указания отдельного элемента вектора или матрицы используются выражения вида X(i) или M(i, j). Так, задавая элемент матрицы М при i = 2 и j = 3, будем иметь:
>> M(2, 3)
ans =
6
Можно, наоборот, любому элементу матрицы или вектора присвоить новое значение. Например, если на место элемента М(3,3) надо вставить число 10, то следует записать:
>> M(3, 3) = 10
M =
1 2 3
4 5 6
7 8 10
Векторы и матрицы с комплексными элементами задаются следующим образом:
>> I = sqrt(-1);
>> M1 = [1 2;3 4]+i*[5 6;7 8]
M1 =
1.0000 + 5.0000i 2.0000 + 6.0000i
3.0000 + 7.0000i 4.0000 + 8.0000i
или
>> i=sqrt(-1);
>> M1=[1+5i 2+6i;3+7i 4+8i]
M1 =
1.0000 + 5.0000i 2.0000 + 6.0000i
3.0000 + 7.0000i 4.0000 + 8.0000i
При этом оператор присваивания i = sqrt(-1) необходимо записывать в том случае, если перед этим в сеансе работы переменной i присваивалось какое-либо значение. В противном случае запись данного оператора необязательна, так как системная переменная i − мнимая единица по умолчанию.
В языке MATLAB предусмотрено несколько функций, которые позволяют формировать матрицу на основе другой (заданной) матрицы или используя некоторый заданный вектор. К таким функциям относятся следующие:
fliplr(A) − формирует матрицу, переставляя столбцы заданной матрицы А относительно вертикальной оси, например:
A =
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
>> fliplr(A)
ans =
6 5 4 3 2 1
12 11 10 9 8 7
18 17 16 15 14 13
flipud(A) − формирует матрицу, переставляя строки заданной матрицы А относительно горизонтальной оси:
>> flipud(A)
ans =
13 14 15 16 17 18
7 8 9 10 11 12
1 2 3 4 5 6
rot90(A) − формирует матрицу путем «поворота» заданной матрицы А на 90 градусов против часовой стрелки:
>> rot90(A)
ans =
6 12 18
5 11 17
4 10 16
3 9 15
2 8 14
1 7 13
Формирование диагонали. Если x – вектор, то функция diag(x) создает квадратную матрицу с элементами заданного вектора на главной диагонали (другие элементы формируемой матрицы равны нулю).
>> V = [3 5 ‐1 9];
>> diag(V)
ans =
3 0 0 0
0 5 0 0
0 0 ‐1 0
0 0 0 9
Элементы заданного вектора x могут быть установлены на любую (не обязательно главную) диагональ формируемой матрицы. Для этого при обращении к функции необходимо ввести еще один параметр k – целое число. Это число указывает на номер диагонали, отсчитываемый от главной диагонали. При этом отсчет ведется вверх для положительного числа (k > 0) и – вниз для отрицательного (k < 0), например:
>> diag(V, ‐1)
ans =
0 0 0 0 0
3 0 0 0 0
0 5 0 0 0
0 0 ‐1 0 0
0 0 0 9 0
Извлечение диагонали. Если x – матрица, то функция diag(х) создает векторстолбец, состоящий из элементов главной диагонали заданной матрицы x. Так, для матрицы А, введенной ранее в примере применения процедуры fliplr, извлечение главной диагонали осуществляется по следующей команде:
>> diag(A)
ans =
1 8 15
Если из заданной матрицы необходимо извлечь какую-либо другую диагональ, то номер этой диагонали необходимо дополнительно указать в списке параметров для получения соответствующего вектор-столбца, например:
>> diag(A, 3) >> diag(A, ‐2)
ans = ans =
4 13
11
18
В процессе решения тех или иных задач часто возникает необходимость внесения некоторых изменений в исходные матрицы. Эти изменения могут касаться как простых операций, связанных, например, с заменой части элементов матрицы на их новые значения, так и более сложных преобразований. Часто требуется из нескольких малых матриц сформировать большую матрицу. Такое объединение малых матриц в большую называется конкатенацией (сцеплением). Иногда, напротив, требуется удалить из исходной матрицы часть строк или столбцов, в результате чего создается меньшая матрица из большей. Рассмотрим возможности системы MATLAB в отношении указанных операций.
Объединение малых матриц в большую (конкатенация)
Общий принцип горизонтальной конкатенации: блоки-матрицы Ai имеют одинаковое число строк и объединяются в обобщенную «строку»
A = [A1, A2, … , An],
отделяясь между собой пробелами или запятыми. При вертикальной конкатенации блоки-матрицы Ai должны иметь одинаковое число столбцов, что позволяет сцепить их в обобщенный «столбец»
A = [A1; A2; … ; An].
При этом блоки отделяются друг от друга точкой с запятой. Для иллюстрации конкатенации создадим вначале несколько исходных векторов и матриц:
>>A = ones(3) >> B = eye(3)*(‐3) A = B =
1 1 1 ‐3 0 0
1 1 1 0 ‐3 0 1 1 1 0 0 ‐3
>> X = [6:8]
X =
6 7 8
>> D=[A X'] % Горизонтальная конкатенация
D =
1 1 1 6
1 1 1 7
1 1 1 8
>> V=[B;A] % Вертикальная конкатенация
V =
-3 0 0
0 -3 0
0 0 -3
1 1 1
1 1 1
1 1 1
Извлечение и вставка частей матриц
Для извлечения части матрицы из матрицы А необходимо обратиться к имени этой матрицы с указанием в круглых скобках номеров строк и столбцов следующим образом: A(i:j, k:l). Пусть из полученной большой матрицы V необходимо выделить блок размером 3×2, ограниченный 2-й и 4-й строками и 2-м и 3-м столбцами:
>> M=V(2:4,2:3) % Извлечение подматрицы M из матрицы V
M =
-3 0
0 -3
1 1
Пусть требуется создать векторы X1 и Y1. Причем вектор X1 состоит из элементов 2-го столбца матрицы M, а вектор Y1 состоит из элементов 1-й строки матрицы M. Тогда необходимо записать:
>> X1=M(:,2) >> Y1=M(1,:)
X1 = Y1 =
0 -3 0
-3
1
Для вставки подматрицы M в большую матрицу А необходимо обратиться к имени этой матрицы с помощью следующего оператора присваивания: A(i:j, k:l) = М. При этом порядок подматрицы M должен соответствовать указанным в круглых скобках номерам строк и столбцов матрицы А. Пример:
% Вставка блока (4×2) из нулей в матрицу V
>> V(3:6,1:2)=zeros(4,2)
V =
-3 0 0
0 -3 0
0 0 -3
0 0 1
0 0 1
0 0 1
Любую матрицу M можно «растянуть» в единый вектор K с помощью простой записи: K = M(:).
>> K=M(:)
K =
-3
0
1
0
-3
1
Удаление столбцов и строк матриц
Для удаления отдельных строк и столбцов матрицы используются пустые квадратные скобки [ ]. Проделаем это над матрицей V, заданной выше:
>>V(1:4, :)=[]
% Удалеиие с 1‐й по 4‐ю строку матрицы V
V =
0 0 1
0 0 1
Теперь из вновь образованной матрицы V удалим 1-й, 3-й столбeц:
>> V(:,[1,3])=[]
V =
0
0