умножение квадратных матриц без использования встроенных функций numpy
нужно перемножить две квадратные матрицы: без использования встроенных функций numpy вот что получается у меня :
for i in range(len(a)):
for j in range(len(a)):
c[i][j] = (a[i][j] * b[i][j])
print(c, end=' ')
print()
но это умножение не строка на столбец как это нужно а поэлементное перемножение. как реализовать перемножение матриц строка на столбец по правилам математики?
Ответы (5 шт):
b = list(zip(*b))
for i in range(len(a)):
for j in range(len(a)):
c[i][j] = (a[i][j] * b[i][j])
length = len(first_matrix)
result_matrix = [[0 for i in range(length)] for i in range(length)]
for i in range(length):
for j in range(length):
for k in range(length):
result_matrix[i][j] += first_matrix[i][k] * second_matrix[k][j]
from typing import List
def vec_product(vec1: List[int], vec2: List[int]) -> int:
return sum([int(x * y) for x, y in zip(vec1, vec2)])
def matrix_transpose(mat: List[List]) -> List[List]:
return [*map(list, zip(*mat))]
def matrix_product(mat1: List[List[int]], mat2: List[List[int]]):
l, n = len(mat1), len(mat2[0])
ans = [[0 for i in range(n)] for j in range(l)]
for i in range(l):
for j in range(n):
vec1 = mat1[i]
vec2 = matrix_transpose(mat2)[j]
ans[i][j] = vec_product(vec1, vec2)
return ans
В вашей программе нужно вместо a[i][j] * b[i][j] сделать:
сумму всех
a[i][k] * b[k][j], гдеkменяется от0доlen(a) - 1.
Перемножить возможно даже неквадратные матрицы, когда:
- количество столбцов первой матрицы то же самое как количество строк второй матрицы,
значит, когда
- первая матрица (
a) типаm × n(т.е.mстрок иnстолбцов), и - вторая матрица (
b) типаn × k.
(Результатом будет тогда матрица типа m × k.)
Я сделал именно такую программу — когда вы хотите это специально только для перемножения квадратных матриц, удалите вторую и третью строку и в остальной части (вместо n и k) примените только m:
m = len(a) # a: m × n
n = len(b) # b: n × k
k = len(b[0])
c = [[None for __ in range(k)] for __ in range(m)] # c: m × k
for i in range(m):
for j in range(k):
c[i][j] = sum(a[i][kk] * b[kk][j] for kk in range(n))
print(c)
Тест:
Для матриц a (типа 2 × 3) и b (типа 3 × 4):
a = [[1, 1, 0],
[1, 0, 2]]
b = [[1, 0, 2, 1],
[2, 1, 2, 0],
[1, 1, 0, 3]]
программа выводит как результат (правильный) такую матрицу c (типа 2 × 4):
[[3, 1, 4, 1], [3, 2, 2, 7]]
Примечание 1:
Для такого красивого вывода я не использовал функцию print(), а pprint() из стандартного модуля pprint:
from pprint import pprint
pprint(c, width=15)
Примечание 2:
Правильность возможно проверить например в NumPy:
>>> import numpy as np
>>> np.array(a) @ b
array([[3, 1, 4, 1],
[3, 2, 2, 7]])
length = len(a)
c = [[sum(a[i][n] * b[n][j] for n in range(length)) for j in range(length)] for i in range(length)]