Матрицы в среде MATLAB

Эта тема содержит введение в создание матриц и выполнение основных матричных вычислений в MATLAB®.

Среда MATLAB использует термин матрица, чтобы указать на переменное, содержащее вещественные или комплексные числа, расположенные в двумерной сетке. Массив является, в более общем плане, вектором, матрицей или более высокой размерной сеткой чисел. Все массивы в MATLAB являются прямоугольными, в том смысле, что векторы компонента по любому измерению являются всеми одинаковыми длина. Математические операции, заданные на матрицах, являются предметом линейной алгебры.

Создание матриц

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

A = pascal(3)
A =
       1     1     1
       1     2     3
       1     3     6

Или, можно создать несимметричную матрицу магического квадрата, которая имеет равные суммы строки и столбца:

B = magic(3)
B =
       8     1     6
       3     5     7
       4     9     2

Другим примером является 3 2 прямоугольная матрица случайных целых чисел. В этом случае первый вход к randi описывает область значений возможных значений для целых чисел, и вторые два входных параметров описывают количество строк и столбцов.

C = randi(10,3,2)
C =

     9    10
    10     7
     2     1

Вектор-столбцом является m-by-1 матрица, вектор - строка является 1 n матрицей, и скаляр является матрицей 1 на 1. Чтобы задать матрицу вручную, используйте квадратные скобки [ ], чтобы обозначить начало и конец массива. В скобках используйте точку с запятой ;, чтобы обозначить конец строки. В случае скаляра (матрица 1 на 1), не требуются скобки. Например, эти операторы производят вектор-столбец, вектор - строку и скаляр:

u = [3; 1; 4]

v = [2 0 -1]

s = 7
u =
       3
       1
       4

v =
       2     0    -1

s =
       7

Для получения дополнительной информации о создании и работе с матрицами, смотрите Создание, конкатенацию и расширение матрицы.

Добавление и вычитание матриц

Сложение и вычитание матриц и массивов выполняются поэлементно или поэлементные. Например, добавление A к B и затем вычитание A от результата восстанавливают B:

X = A + B
X =
       9     2     7
       4     7    10
       5    12     8
Y = X - A
Y =
       8     1     6
       3     5     7
       4     9     2

Сложение и вычитание требуют, чтобы обе матрицы имели совместимые размерности. Если размерности несовместимы, ошибка заканчивается:

X = A + C
Error using  + 
Matrix dimensions must agree.

Для получения дополнительной информации см. Массив по сравнению Матричные операции.

Векторные произведения и транспонируют

Вектор - строка и вектор-столбец той же длины могут быть умножены в любом порядке. Результатом является или скаляр, названный скалярным произведением, или матрица, названная векторным произведением:

u = [3; 1; 4];
v = [2 0 -1];
x = v*u
x =

     2
X = u*v
X =

     6     0    -3
     2     0    -1
     8     0    -4

Для действительных матриц транспонировать операция обменивается a i j и a j i. Для комплексных матриц другой фактор состоит в том, взять ли сопряженное комплексное число комплексных записей в массиве, чтобы сформировать комплексное сопряженное транспонирование. MATLAB использует оператор апострофа ('), чтобы выполнить комплексное сопряженное транспонирование и оператор точечного апострофа (.'), чтобы транспонировать без спряжения. Для матриц, содержащих все действительные элементы, эти два оператора возвращают тот же результат.

Матричный A = pascal(3) в качестве примера симметричен, таким образом, A' равен A. Однако B = magic(3) не симметричен, таким образом, B' отразили элементы по основной диагонали:

B = magic(3)
B =

     8     1     6
     3     5     7
     4     9     2
X = B'
X =

     8     3     4
     1     5     9
     6     7     2

Для векторов перемещение превращает вектор - строку в вектор-столбец (и наоборот):

x = v'

x =
       2
       0
      -1

Если x и y являются оба действительными вектор-столбцами, то продукт x*y не задан, но эти два продукта

x'*y

и

y'*x

приведите к тому же скалярному результату. Это количество используется так часто, оно имеет три различных имени: скалярное произведение, скалярное произведение или скалярное произведение. Существует даже специализированная функция для скалярных произведений под названием dot.

Для комплексного вектора или матрицы, z, количества z' не только транспонирует вектор или матрицу, но также и преобразовывает каждый комплексный элемент в его сопряженное комплексное число. Таким образом, знак мнимой части каждого комплексного элемента изменения. Например, рассмотрите комплексную матрицу

z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]
z =

   1.0000 + 2.0000i   7.0000 - 3.0000i   3.0000 + 4.0000i
   6.0000 - 2.0000i   0.0000 + 9.0000i   4.0000 + 7.0000i

Комплексное сопряженное транспонирование z:

z'
ans =

   1.0000 - 2.0000i   6.0000 + 2.0000i
   7.0000 + 3.0000i   0.0000 - 9.0000i
   3.0000 - 4.0000i   4.0000 - 7.0000i

Неспрягаемый комплекс транспонирует, где комплексная часть каждого элемента сохраняет свой знак, обозначается z.':

z.'
ans =

   1.0000 + 2.0000i   6.0000 - 2.0000i
   7.0000 - 3.0000i   0.0000 + 9.0000i
   3.0000 + 4.0000i   4.0000 + 7.0000i

Для комплексных векторов эти два скалярных произведения x'*y и y'*x являются сопряженными комплексными числами друг друга и скалярным произведением, x'*x комплексного вектора с собой действителен.

Умножение матриц

Умножение матриц задано способом, который отражает состав базовых линейных преобразований и позволяет компактное представление систем одновременных линейных уравнений. Матричное произведение C = AB задан, когда размерность столбца A равна размерности строки B, или когда один из них является скаляром. Если A является m-by-p, и B является p-by-n, их продукт, C является m-by-n. Продукт может на самом деле быть задан с помощью MATLAB циклы for, обозначение colon и векторные скалярные произведения:

A = pascal(3);
B = magic(3);
m = 3; 
n = 3;
for i = 1:m
     for j = 1:n
        C(i,j) = A(i,:)*B(:,j);
     end
end

MATLAB использует звездочку, чтобы обозначить умножение матриц, как в C = A*B. Умножение матриц не является коммутативным; то есть, A*B обычно не равен B*A:

X = A*B
X =
      15    15    15
      26    38    26
      41    70    39
Y = B*A
Y =
      15    28    47
      15    34    60
      15    28    43

Матрица может быть умножена справа вектор-столбцом и слева вектором - строкой:

u = [3; 1; 4];
x = A*u
x =

     8
    17
    30
v = [2 0 -1];
y = v*B
y =

    12    -7    10

Прямоугольные умножения матриц должны удовлетворить условия совместимости размерности. Поскольку A имеет размер 3х3, и C 3 2, можно умножить их, чтобы добраться 3 2 результат (общие внутренние отмены размерности):

X = A*C
X =

    24    17
    47    42
    79    77

Однако умножение не работает в обратном порядке:

Y = C*A
Error using  * 
Incorrect dimensions for matrix multiplication. Check that the number of columns 
in the first matrix matches the number of rows in the second matrix. To perform 
elementwise multiplication, use '.*'.

Можно умножить что-либо со скаляром:

s = 10;
w = s*y
w =

   120   -70   100

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

Единичная матрица

Общепринятое математическое обозначение использует прописную букву I, чтобы обозначить единичные матрицы, матрицы различных размеров с единицами на основной диагонали и нулях в другом месте. Эти матрицы имеют свойство, что A I = A и I A = A каждый раз, когда размерности совместимы.

Исходная версия MATLAB не могла использовать I с этой целью, потому что это не различало прописные и строчные буквы, и i уже служил индексом и как комплексной единицей. Таким образом, английская игра слов языка была введена. Функция

eye(m,n)

возвращает m-by-n прямоугольная единичная матрица, и eye(n) возвращает n-by-n квадратная единичная матрица.

Матричная инверсия

Если матричный A является квадратным и несингулярным (ненулевой детерминант), то уравнения A X = I и X A = I имеют то же решение X. Это решение называется инверсией A и обозначается A-1. Функция inv и выражение A^-1 оба вычисляют матричную инверсию.

A = pascal(3)
A =
       1     1     1
       1     2     3
       1     3     6
X = inv(A)
X =

    3.0000   -3.0000    1.0000
   -3.0000    5.0000   -2.0000
    1.0000   -2.0000    1.0000
A*X
ans =

    1.0000         0         0
    0.0000    1.0000   -0.0000
   -0.0000    0.0000    1.0000

Детерминант, вычисленный det, является мерой масштабного коэффициента линейного преобразования, описанного матрицей. Когда детерминант является точно нулем, матрица сингулярна, и никакая инверсия не существует.

d = det(A)
d =

     1

Некоторые матрицы почти сингулярны, и несмотря на то, что обратная матрица существует, вычисление восприимчиво к числовым ошибкам. Функция cond вычисляет номер условия для инверсии, которая дает индикацию относительно точности результатов матричной инверсии. Номер условия колеблется от 1 для численно стабильной матрицы к Inf для сингулярной матрицы.

c = cond(A)
c =

   61.9839

Редко необходимо сформировать явную инверсию матрицы. Частое неправильное употребление inv возникает при решении системы линейных уравнений A x = b. Лучший способ решить это уравнение, с точки зрения и времени выполнения и числовой точности, состоит в том, чтобы использовать матричный оператор наклонной черты влево x = A\b. Смотрите mldivide для получения дополнительной информации.

Продукт тензора Кронекера

Кронекеровым продуктом, kron(X,Y), двух матриц является большая матрица, сформированная из всех возможных продуктов элементов X с теми из Y. Если X является m-by-n, и Y является p-by-q, то kron(X,Y) является mp-by-nq. Элементы располагаются таким образом, что каждый элемент X умножается на целый матричный Y:

[X(1,1)*Y  X(1,2)*Y  . . .  X(1,n)*Y
                     . . .
 X(m,1)*Y  X(m,2)*Y  . . .  X(m,n)*Y]

Кронекеров продукт часто используется с матрицами нулей и единиц, чтобы создать повторенные копии маленьких матриц. Например, если X является матрицей 2 на 2

X = [1   2
     3   4]

и I = eye(2,2) является единичной матрицей 2 на 2, затем:

kron(X,I)
ans =

     1     0     2     0
     0     1     0     2
     3     0     4     0
     0     3     0     4

и

kron(I,X)
ans =

     1     2     0     0
     3     4     0     0
     0     0     1     2
     0     0     3     4

Кроме kron, некоторыми другими функциями, которые полезны, чтобы реплицировать массивы, является repmat, repelem и blkdiag.

Векторные и матричные нормы

p - норма векторного x,

xp=(|xi|p)1p,

вычисляется norm(x,p). Эта операция задана для любого значения p> 1, но наиболее распространенные значения p равняются 1, 2, и ∞. Значением по умолчанию является p = 2, который соответствует Евклидовой длине или векторному значению:

v = [2 0 -1];
[norm(v,1) norm(v) norm(v,inf)]
ans =

    3.0000    2.2361    2.0000

p - норма матричного A,

Ap=max xAxpxp,

может быть вычислен для p = 1, 2, и ∞ norm(A,p). Снова, значением по умолчанию является p = 2:

A = pascal(3);
[norm(A,1) norm(A) norm(A,inf)]
ans =

   10.0000    7.8730   10.0000

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

vecnorm(A)
ans =

    1.7321    3.7417    6.7823

Используя многопоточное вычисление с функциями линейной алгебры

MATLAB поддерживает многопоточное вычисление во многой линейной алгебре и поэлементных числовых функциях. Эти функции автоматически выполняются на нескольких потоках. Для функции или выражения, чтобы выполниться быстрее на нескольких центральных процессорах, много условий должны быть верными:

  1. Функция выполняет операции, что легко раздел в разделы, которые выполняются одновременно. Эти разделы должны смочь выполниться с небольшой связью между процессами. Они должны потребовать немногих последовательных операций.

  2. Размер данных является достаточно большим так, чтобы любые преимущества параллельного выполнения перевесили время, требуемое разделить данные и управлять отдельными потоками выполнения. Например, большинство функций убыстряется только, когда массив содержит несколько тысяч элементов или больше.

  3. Операция не ограничена памятью; время вычислений не во власти времени доступа к памяти. Как правило сложные функции ускоряют больше, чем простые функции.

Матрица умножает (X*Y) и матричную степень, которую операторы (X^p) показывают значительному увеличению скорости на больших массивах с двойной точностью (на порядке 10 000 элементов). Функции анализа матрицы det, rcond, hess и expm также показывают значительное увеличение скорости на больших массивах с двойной точностью.

Похожие темы