Python矩阵代码变量显示未分配

时间:2017-09-03 01:42:12

标签: python matrix undefined

以下代码试图在Python 3.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

1 个答案:

答案 0 :(得分:1)

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

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

     a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    
  2. 因此访问a[3][...]将不起作用,因为它不存在。 a[0][1, 2, 3]等等。

    1. 空容器没有索引。定义c时,您定义了一个空列表列表。 c[0]处的列表是一个空列表[]。因此,尝试访问c[0][0]将无效,因为第0个元素不存在(无论是用于引用还是用于分配)。
    2. 就像你做的那样:

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

      如果您想要执行点积,我建议使用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]]