Напишите функцию умножения трёх матриц (не пользуйтесь встроенными функциями такими как np.dot(), @)
Взял за основу код матричного перемножения 2 матриц и доработал для 3 матриц. Пробовал разными способами. Две матрицы перемножает корректно, а на третьей результат не совпадает с проверочным, если использовать @, за исключением последней строчки. Код получился следующий`
import numpy as np
scalar1 = 2 # Создал скаляр
scalar2 = 7
scalar3 = 5
scalar4 = 1
scalar5 = 1
vector = np.array([scalar1, scalar2, scalar3, scalar4,scalar5]) # создаю вектор-строку
vector_vertical = np.array([scalar1, scalar2, scalar3, scalar4, scalar5]).reshape((5,1)) # ветрикальный скаляр
matrix1=vector*vector_vertical # создаю матрицу
matrix2=matrix*scalar2 #создаю матрицу
matrix2=matrix2
matrix3=matrix1/scalar2 #создаю матрицу
# Функция матричного умножения, принимающая на вход 3 матрицы
def prod_matrix(matrix1, matrix2, matrix3):
shape1 = matrix1.shape # определим форму 1-ой матрицы
shape2 = matrix2.shape # определим форму 2-ой матрицы
shape3 = matrix3.shape # определим форму 3-ей матрицы
if shape1[1] != shape2[0]: # если количество столбцов 1-ой матрицы не равно количеству строк 2-ой матрицы
return np.array([]) # тогда умножение невозможно, возвращаем пустой массив
if shape1[1] != shape3[0]: # если количество столбцов 1-ой матрицы не равно количеству строк 3-ой матрицы
return np.array([]) # тогда умножение невозможно, возвращаем пустой массив
out_matrix = np.zeros((shape1[0], shape2[1])) # создадим матрицу из 0, формой (количество строк 1-ой)Х(количество столбцов 2-ой) матриц
tot_matrix = np.zeros((shape1[0], shape2[1])) # создадим матрицу из 0, формой (количество строк 1-ой)Х(количество столбцов 2-ой) матриц
for i in range(shape1[0]): # пройдемся по индексам строк 1-ой матрицы
for j in range(shape2[1]): # пройдемся по индексам столбцов 2-ой матрицы
curr_cell = 0
for t in range(shape1[1]): # пройдемся по индексам стобцов 1-ой матрицы
curr_cell += matrix1[i,t] * matrix2[t,j] # посчитаем сумму произведения элементов строки 1-ой матрицы и столбцов 2-ой матрицы
out_matrix[i,j] = curr_cell # заменим значения в матрице состоящих из 0, на посчитанную сумму произведений
shape4 = out_matrix.shape # определим форму полученной матрицы
for i in range(shape4[0]): # пройдемся по индексам строк полученной матрицы
for k in range(shape3[1]): # пройдемся по индексам столбцов 3-ей матрицы
curr_celltot = 0
for j in range(shape4[1]): # пройдемся по индексам стобцов полученной матрицы
curr_celltot += out_matrix[i,j] * matrix3[j,k] # посчитаем сумму произведения элементов строки полученной матрицы и столбцов 3-ей матрицы
tot_matrix[i,k] = curr_celltot # заменим значения в матрице состоящих из 0, на посчитанную сумму произведений
return tot_matrix # вернем полученную матрицу
prod_matrix(matrix, matrix1,matrix2)
Где искать ошибку? Заранее благодарен.
Ответы (2 шт):
Ошибку искать в вашей программе. Но правильно вопрос задать не "где", а "как". Для этих целей существует процесс отладки - надеюсь вам про нее уже рассказывали на уроках. Если вы работаете в любой IDE - то используете пошаговое выполнение кода, или режим Debug c точками останова, с проверкой и анализом результатов (состояния переменных программы) на каждом шаге.
Если же по какой-либо причине вы это делать не хотите - тогда вставляете в код вывод промежуточных результатов оператором print() и анализируете результаты после окончания скрипта.
А вообще-то профессия программиста это не написание кода, а на 80% это отладка кода. Так что рекомендую эту премудрость освоить как можно раньше.
На мой вгляд, Вы подошли к решению не с той стороны. А на самом деле, есть гораздо более простой вариант:
def prod_matrix_2(matrix1, matrix2):
. . .
return result
def prod_matrix_3(matrix1, matrix2, matrix3):
wrk = prod_matrix_2(matrix1, matrix2)
return prod_matrix_2(wrk, matrix3)