[БЕЗ_ЗВУКА] В это видео мы поговорим о том, какие операции можно вводить над матрицами. В прошлый раз мы уже разобрались с вами, как умножать матрицу на вектор. А именно: мы можем умножать матрицу размера m × n на вектор-столбец размера n × 1. Для этого мы домножаем каждый элемент i-той строки на соответствующий элемент вектора и складываем. В итоге получаем i-тый элемент вектора-результата. Получаем мы на выходе вектор размера m × 1. Обратите внимание, мы могли умножать матрицу на вектор только в том случае, если число столбцов в матрице совпадало с длиной вектора. Иначе операция была не определена. Давайте теперь поговорим о том, как ввести более общую операцию — умножение матрицы на матрицу. Она будет возможна только в том случае, если число столбцов в первой матрице совпадает с числом строк во второй матрице. Иначе эта операция будет не определена, делать её будет невозможно. Итак. Пусть есть две матрицы — A и B. Матрица A имеет размер m × n, а матрица B имеет размер n × k. Результатом будет матрица C размера m × k. То есть строк в ней будет столько же, сколько в первой матрице, а столбцов столько же, сколько во второй. Чтобы перемножить матрицы A и B и получить C, мы делаем следующее: i-тый j-тый элемент матрицы C получается поэлементным умножением i-той строки матрицы A на j-тый столбец матрицы B, что затем складывается. Именно так и получается матрица C. Давайте разберём пример. Пусть есть две матрицы, первая имеет размер 3 × 2, вторая 2 × 3. Результатом будет матрица размера 3 × 3. Давайте получим её элемент с индексами 1, 1. Для этого нам понадобится первая строка матрицы A и первый столбец матрицы B. Перемножаем их. Получаем 1 * 1 + 2 * 0. Значит, элемент с индексами 1, 1 матрицы C будет равен 1. Посчитаем элемент с индексами 1, 2. Для этого мы умножаем 1 на 0 и 2 на 0 и складываем. Получаем 0. Чтобы получить элемент с индексами 1, 3, умножаем 1 на 0, прибавляем 2 * 2, получаем 4. Наконец, чтобы получить элемент с индексом 2, 1, умножаем 0 на 1, 1 на 0, получаем 0. И так далее. У вас, наверное, уже возник вопрос: почему мы ввели операцию умножения матриц именно так? Эта формула не кажется интуитивной, она не приходит в голову в первую очередь. Но, оказывается, у неё есть довольно понятный глубокий смысл. Давайте попробуем его понять. Мы уже выясняли, что матрица, по сути, задаёт линейное преобразование, линейную функцию из одного векторного пространства в другое. То есть, по сути, она принимает на вход один вектор и возвращает другой, уже другой разрядности. Например, матрица A может задавать преобразование из пространства V в пространство W, а матрица B — задавать преобразование из пространства W в пространство T. Поскольку это функции, можем определить их композицию, B от A, то есть сначала к вектору из пространства V применяем преобразование A, потом преобразование B, и в итоге вектор из пространства V переходит в пространство T. При этом оказывается, если мы перемножим матрицы B и A, то полученное произведение BA будет как раз задавать преобразование из пространства V в пространство T, ровно то преобразование, которое является композицией B и A. Это одна из главных причин, почему умножение вводится именно так. Есть ещё одна причина. Представьте, что у нас есть некоторая система линейных уравнений Ax = b. Например, это может быть задача поиска линейного классификатора для предсказания возникновения рака. В этом случае в строках A записаны пациенты, для каждого пациента известно, какие мутации имеют место в его геноме, а в B записан правильный ответ: возникнет рак через 5 лет или не возникнет. Тогда x — это веса, с которыми складываются индикаторы наличия мутации в геноме, и получается некоторый ответ. При этом, на самом деле, x может тоже выражаться через другой вектор z, то есть может иметь место уравнение x = Bz. Откуда оно может быть? Оно может задавать некоторые дополнительные ограничения. Например, что две определённые мутации должны носить одинаковый вклад в принятие решения, то есть должны иметь одинаковый вес. Это всё можно отрегулировать матрицей B. В итоге получается, что нужно решать систему вида A*(Bz) = b. Так вот. Оказывается, что если мы поставим выражение для вектора x, то есть x = Bz, в первое уравнение, раскроем скобки, сгруппируем и получим уравнение относительно z, то мы получим систему с матрицей, которая будет равняться произведению A и B. То есть мы ввели умножение так, чтоб можно было подставлять одну систему линейных уравнений в другую, и при этом всё сохранялось. Хорошо. Давайте поговорим о более простых операциях — сложение и умножение на число. Здесь всё гораздо более интуитивно. Чтобы сложить две матрицы, мы должны убедиться, что они имеют одинаковый размер. То есть обе имеют размерность m × n, иначе сложение не определено. Складываем мы поэлементно. То есть i-тый j-тый элемент матрицы C суммы A и B будет равняться aij + bij. Всё очень просто. То же самое касается умножения на число. Чтобы умножить матрицу b на некоторое число α, просто умножаем на α каждый элемент. То есть cij — результат — будет равен α * bij. Наконец, поговорим о такой операции, как транспонирование. Мы будем с ней сталкиваться довольно часто. Для этого нам понадобится понятие главной диагонали. Пусть есть некая матрица A размера 4 × 3. Главной диагональю называются все её элементы, у которых первый индекс равен второму, то есть все элементы вида aii. В нашем случае, это будет элемент (1, 1), (2, 2) и (3, 3), которые имеют значения 1, 3 и 0. Это действительно диагональ. Транспонирование — это, по сути, поворот относительно главной диагонали. Матрица A размера m × n превращается в матрицу A транспонированное размера n × m. Кстати, A транспонированное обозначается как A с верхним индексом T. Иными словами, i-тый j-тый элемент транспонированной матрицы равен j-тому i-тому элементу исходной матрицы. Ещё можно интерпретировать это так, что строки исходной матрицы становятся столбцами транспонированной матрицы. Вернёмся к нашему примеру. Матрица размера 4 × 3 становится матрицей 3 × 4, при этом главная диагональ 1, 3, 0 остаётся на своём месте, а всё остальное поворачивается относительно неё. То есть, например, столбец 1, 2, 2 ,5 (первый столбец) становится первой строкой 1, 2, 2, 5. И так далее. Итак. Что мы узнали? Умножение матриц — это довольно хитрая операция, которая при этом имеет довольно глубокий смысл. Например, она соответствует композиции двух линейных преобразований или соответствует постановке в систему линейных уравнений вектора, который тоже выражается как матрица умножить на вектор. При этом сложение и умножение для матриц (умножение на константу) определяется интуитивно, просто поэлементно. Также мы изучили с вами транспонирование — это операция, которая меняет строки и столбцы матрицы местами. В следующем видео мы поговорим о том, что такое ранг и определитель.