2017-07-15 25 views
0

当我开始学习python时偶然发现了一个简单的问题。我觉得这个输出很奇特。我想制作一个2D计算器,但是我的'matrixcreator'函数显然会产生不同于我想的矩阵。为什么'matrixmultiplicator'的矢量不一样?感谢矩阵产生2个不同的答案

def matrixmultiplicator(matrix, vector1, vector2,): 
    for x in range(len(vector1)): 
     for y in range(len(vector2)): 
      matrix[0][0]=vector1[x]*vector2[y] 
    return matrix 

def matrixcreator(x,y): 
    matrix=[] 
    list=[] 
    #create first dimension 
    for a in range(x): 
     matrix.insert(a,0) 
    #Create the second dimension 
    for b in range(y): 
     list.append(0) 
     for a in range(x): 
      matrix[a]=list 
    return matrix 

if __name__ == '__main__': 
    a=[2,4] 
    b=[2,4] 
    matrix=[[0,0],[0,0]] 
    print(matrix) 
    print(matrixmultiplicator(matrix,a,b)) 
    matrix=matrixcreator(2,2) 
    print(matrix) 
    print(matrixmultiplicator(matrix,a,b)) 

在pycharm输出(我使用)是:

[[0,0],[0,0]]

[[16,0],[0, 0]]

[[0,0],[0,0]]

[[16,0],[16,0]]

+0

你可以修复matrixcreator上的缩进,以便我们可以看到它的作用?如现在所示,您会收到错误消息。 –

+0

“为什么'matrixmultiplicator'的矢量不一样?”和什么一样?你期望的结果是什么? –

+0

我建议你学习如何调试你的代码。您可以添加'print()'语句或使用IDE中的调试器,例如PyCharm。无论哪种方式,您都需要查看程序中变量的值,并找出它们与您期望的不同之处。那么你需要弄清楚为什么**他们与你所期望的不同。 –

回答

0

这就是你应该如何创建你的矩阵。您需要为每个索引创建一个新列表,并且您之前正在执行一些不必要的步骤。

def matrixcreator(x,y): 
    matrix=[] 
    #create first dimension 
    for a in range(x): 
     list=[] 
     for b in range(y): 
      list.append(0) 
     matrix.insert(a,list) 
    return matrix 

我认为你的乘法例程也是错误的,但我不确定。如果只设置一个坐标,为什么要使用矩阵作为结果?

+0

解决了这个问题!我正在练习一个3D计算器,但是这些基本步骤都是错误的,所以我不得不简化一下,看看问题出在哪里。目的是组成自定义矩阵,然后将它们相乘。 –

1

matrix=[[0,0],[0,0]]使用两个不同列表重新呈现第二个维度。但是,在矩阵创建器中,您引用的是使用list=[]分配的同一个列表对象。

编辑:这可以在

for a in range(x): 
    matrix[a]=list 

中可以看出,其中相同的列表对象分配给在基质中的多个位置。

除此之外,我不太清楚你打算如何处理你的代码。循环感觉不佳。首先你插入0个零到matrix。随后,您将零添加到列表中,并且对于该步骤的每次迭代,都使用相同的列表对象覆盖矩阵的每个索引。

编辑2:假设你想创建一个x行和y列的矩阵,您可以简化代码:

def matrixcreator(x,y): 
    return [[0] * y for _ in range(x)] 

它创建一个列表理解由x的充满Ÿ零不同的列表。

+0

没错!认为这是问题,它指的是相同的内存地址相同的列表或类似的东西。将不得不找到一种方法来分配两个不同的列表对象。谢啦。 –