Как присвоить результат новой матрице в матричном умножении с использованием циклов - PullRequest
0 голосов
/ 23 апреля 2019

Я написал алгоритм умножения двух матриц на 2х3 и 3х2 соответственно. Алгоритм ведет себя отлично. Проблема в том, как сохранить результаты в результирующую матрицу 2x2?

Ниже приведен код

from numpy import *

m1 = matrix('1 2 3; 4 5 6')
m2 = matrix('7 8; 9 10; 11 12')
m4 = matrix('')

for k in range(len(m1)):
    for i in range(len(m1)):
        m3 = 0
        for j in range(len(m2)):
            m3 = m3 + m1[k, j] * m2[j, i]
        print(m3)


Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Мы можем использовать тот же алгоритм для умножения матриц, используя списки и массивы Numpy

In [30]: l1 = [[1,2,3],[4,5,6]] ; l2 = [[7,8],[9,10],[11,12]]                                                                         
In [31]: l3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*l2)] for row in l1]                    
In [32]: a1 = np.array(l1) ; a2 = np.array(l2)                                                               
In [33]: a3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*a2)] for row in a1]                    
In [34]: a3                                                                                                  
Out[34]: [[58, 64], [139, 154]]
In [35]: l3                                                                                                  
Out[35]: [[58, 64], [139, 154]]

и, для проверки, давайте использовать @, встроенный оператор умножения матриц

In [36]: a1@a2                                                                                               
Out[36]: 
array([[ 58,  64],
       [139, 154]])

Теперь давайте посмотрим, сможем ли мы использовать тот же алгоритм умножения матриц, если наши данные обернуты в класс матрицы

In [37]: m1 = np.matrix(l1) ; m2 = np.matrix(l2)                                                             
In [38]: m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]                    
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-38-2cd8454aa248> in <module>
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <listcomp>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <listcomp>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <genexpr>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
~/lib/miniconda3/lib/python3.7/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
    218         if isinstance(other, (N.ndarray, list, tuple)) :
    219             # This promotes 1-D vectors to row vectors
--> 220             return N.dot(self, asmatrix(other))
    221         if isscalar(other) or not hasattr(other, '__rmul__') :
    222             return N.dot(self, other)

ValueError: shapes (1,3) and (1,2) not aligned: 3 (dim 1) != 1 (dim 0)

Почему у нас есть эта ошибка?размеры такие же, как и раньше, почему у нас разные формы?

Вот почему, когда мы смотрим на элемент m1, у нас нет одномерного массива илине вложенный список, у нас есть еще одна матрица

In [39]: m1[0]                                                                                               
Out[39]: matrix([[1, 2, 3]])

Мораль этой сказки?

Класс матрицы имеет присущую липкость , которая приводит к этому конкретному неожиданному поведениюи к другим, неожиданным поведениям.

Если не знать точно всех проблем, связанных с использованием np.matrix(), лучшим выбором будет использование 2D-массивов, созданных с использованием np.array.

С другой стороны, если кто-то знает точно все проблемы, связанные с использованием np.matrix(), обычно они не хотят использовать np.matrix.

0 голосов
/ 23 апреля 2019

from numpy import *

m1 = matrix('1 2 3; 4 5 6')
m2 = matrix('7 8; 9 10; 11 12')

m1_Row_Col = m1.shape
m2_Row_Col = m2.shape

m3 = [[0 for row in range(m2_Row_Col[1])] for col in range(m1_Row_Col[0])]

for k in range(len(m1)):
    for i in range(m2_Row_Col[1]):
        out = 0
        for j in range(len(m2)):
            out = out + m1[k, j] * m2[j, i]
        m3[k][i] = out
print(m3)
...