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

Python矩阵代码变量显示未赋值,python,matrix,undefined,Python,Matrix,Undefined,下面的代码是在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,

下面的代码是在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

您的代码存在许多问题。让我们一次看一个

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

     a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    
  • 因此,访问[3][…]将不起作用,因为它不存在<代码>一个[0]是
    [1,2,3]

  • 空容器没有索引。定义
    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]]
    

    谢谢你,詹姆斯。我完全支持使用Numpy模块,因为我知道它存在。但是,假设我选择不使用诸如Numpy之类的模块,并决定像我在上面的原始代码中所做的那样使用长度:如果我固定索引位置(从正确的位置开始,就像我没有做的那样),它会起作用吗?如果我只为c变量分配占位符值(即:[0,0,0],[0,0,0],[0,0],[0,0]),它会起作用吗而不是空列表)?是的,那会有用。有比在索引中硬编码更有效的方法来创建
    c
    输出。我会修改我的答案来说明如何。我真的很感谢詹姆斯的帮助。你能解释一下你提供的代码中的符号吗,特别是点积是如何生成的?我不明白xx和yy的用法,或者为什么使用bT:xx*yy代表xx,yy在zip中(x,y))代表y在bT中