Python矩阵代码变量显示未赋值

2024-04-26 23:58:48 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码试图在python3.6.1中创建一个成功的矩阵。如您所见,我分配了alpha和bravo矩阵,并希望代码生成一个Charlie矩阵(列表),其中包含alpha和bravo矩阵相乘的结果。我的问题是,当我运行这个模块时,它说c没有定义;如果我要求a或b也是一样。专业提示或指针有人吗?谢谢你

import math

def matrix(a, b, c):
    a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]]
    c = [[], [], []]
    for c in matrix:
        c[1][1] = a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1]
        c[1][2] = a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2]
        c[1][3] = a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3]
        c[2][1] = a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1]
        c[2][2] = a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2]
        c[2][3] = a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3]
        c[3][1] = a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1]
        c[3][2] = a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2]
        c[3][3] = a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3]
    return c

Tags: 模块代码importalpha列表定义专业def
1条回答
网友
1楼 · 发布于 2024-04-26 23:58:48

你的代码有很多问题。让我们一次看一个

  1. Python是零索引的。在Python中访问数组或列表时,第一个元素是0,第二个元素是1,依此类推。您将a定义为

     a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    

因此访问a[3][...]将不起作用,因为它不存在a[0][1, 2, 3],等等

  1. 空容器没有索引。定义c时,定义了一个空列表列表。保存在c[0]的列表是一个空列表[]。因此尝试访问c[0][0]将不起作用,因为第0个元素不存在(用于引用或分配)

这和你做的一样:

x = []
# this will not work:
x[0] = 1

如果您想执行dot产品,我建议您使用Numpy包。它是用来处理这种数学问题的

import numpy as np

c = np.dot(a, b)
c
# returns:
array([[ 20,  28,  33],
       [ 50,  64,  72],
       [ 80, 100, 111]])

下面是一个纯python方法来获取两个矩阵的点积。它转换b并为每个矩阵生成元素乘积之和。请记住,它不进行维度检查,因此它将截断为最短的可计算结果

def matrix_dot(a, b):
    # transpose b
    bT = list(map(list, zip(*b)))
    # generate the dot product
    c = [[sum(xx*yy for xx,yy in zip(x,y)) for y in bT] for x in a]
    return c

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]]

matrix_dot(a,b)
# returns:
[[20, 28, 33],
 [50, 64, 72],
 [80, 100, 111]]

相关问题 更多 >