当第二个矩阵只有一列时,矩阵乘法抛出错误

问题描述 投票:0回答:1

首先,在Stack Overflow上提出一个问题是一件令人兴奋的事情,因为我一直想进入编码,但实际上并没有真正开始。

我试图在不使用NumPy的情况下在Python中创建矩阵乘法函数。我差不多完成了我的代码,但每当我尝试将矩阵“A”乘以矩阵“B”并且只有一列时,我就会收到错误。

我的代码如下:

import numpy as np

def matrix_multiply(A,B):
row_A = len(A)
col_A = len(A[0])
row_B = len(B)
col_B = len(B[0])
if col_A != row_B:
    return("Invalid matrices")
else:
    result = np.zeros((col_B,row_A))
    for i in range(row_A): # iterate through columns of Y
        for j in range(col_B): # iterate through rows of Y
            for k in range(col_A):
                result[i][j] += A[i][k]*B[k][j]
    return result

我的错误是:

Traceback (most recent call last): File "<stdin>", line 1, in <module>
File "<stdin>", line 13, in matrix_multiply
IndexError: index 1 is out of bounds for axis 0 with size 1

我认为这是“结果[i] [j] + = A [i] [k] * B [k] [j]”部分的问题。

我的代码适用于任何其他大小的矩阵,但是当有一列时,我得到这个索引错误。这是怎么回事?

这是一个例子:

A = np.array([[1,2,3],[2,3,4]])
B = np.array([[2,3],[4,5],[5,6]])

matrix_multiply(A,B)

array([[25., 31.],
   [36., 45.]])

但是当我做的时候......

v = np.array([[4,3,1],[6,7,2]])
g = np.array([[3],[1],[4]])

matrix_multiply(v,g)

我收到了错误。

python matrix matrix-multiplication multiplication
1个回答
0
投票

正如我在评论中所说,你需要在填充result矩阵时交换索引的顺序,然后进行最终数组的转置

问题:你的指数irow_A的长度上运行for i in range(row_A)和指数jcol_B的长度上运行为for j in range(col_B):但是定义空的result数组你交换尺寸因为你使用result = np.zeros((col_B,row_A)),即你首先定义列尺寸然后行尺寸。因此你要么在你的for循环中交换ij,就像我在下面所做的那样,你在初始化result时交换变量,然后像你一样使用[i][j]。那你就不需要转置了。

import numpy as np

def matrix_multiply(A,B):
    row_A = len(A)
    col_A = len(A[0])
    row_B = len(B)
    col_B = len(B[0])
    print (row_B, col_B)
    if col_A != row_B:
        return("Invalid matrices")
    else:
        result = np.zeros((col_B,row_A))
        for i in range(row_A): # iterate through columns of Y
            for j in range(col_B): # iterate through rows of Y
                for k in range(col_A):
                    result[j][i] += A[i][k]*B[k][j]
        return result

例1

A = np.array([[1,2,3],[2,3,4]])
B = np.array([[2,3],[4,5],[5,6]])

result = matrix_multiply(A,B).T
print (result)

# array([[25., 31.],
#    [36., 45.]])

例2

v = np.array([[4,3,1],[6,7,2]])
g = np.array([[3],[1],[4]])

result = matrix_multiply(v,g)
print (result)
# [[19. 33.]]
© www.soinside.com 2019 - 2024. All rights reserved.