умножение квадратных матриц без использования встроенных функций 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 шт):

Автор решения: Danis
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])
→ Ссылка
Автор решения: Alex
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]
→ Ссылка
Автор решения: 8020apol
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
→ Ссылка
Автор решения: MarianD

В вашей программе нужно вместо 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]])
→ Ссылка
Автор решения: Dimitriy Sokolov
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)]  
→ Ссылка