我正在尝试编写一些代码,在其中我需要填写一个矩阵并使它成为身份矩阵,然后我决定将该矩阵制成n个列表的列表,其中第n个列表是一行。 >
I=[]
row=[]
for i in range (0,n):
row.append(0)
for i in range (0,n):
I.append(row)
for k in range (0,3):
I[k][k]=1
我希望这段代码在矩阵的对角线中放入1,其中对角线是I[k][k]
元素k=0,1,2
。
但是在第3个for循环中,我在每一步中将对角线中的0替换为1,而不是使I[k][k]=1
I[0][k]=I[1][k]=I[2][k]=1
,最后得到一个矩阵,每个元素等于1。
我的问题不是如何在python或任何矩阵中创建单位矩阵,我的问题是,为什么第3个for循环这样做,显然I[k][k]
是对角元素,为什么要使其他非对角元素元素等于1?
答案 0 :(得分:1)
创建矩阵时,您可以嵌套for循环,并使用第二个循环填充行,并且当i
等于j
时,您将位于矩阵的对角线中:>
matrix = []
n = 10
for i in range(0, n):
row = []
for j in range(0, n):
if i == j:
row.append(1)
else:
row.append(0)
matrix.append(row)
答案 1 :(得分:1)
好问题!在Python中,变量是指针,因此I
的每个元素都指向相同的row
变量。因此,当您在I
的一行中更改元素时,实际上是在所有行中都对其进行了更改。
这里是一个例子:
n = 3
row = []
for i in range(n):
row.append(0)
I = []
for i in range(n):
I.append(row)
现在,让我们尝试将第一行的第一个元素设置为1,I[0][0] = 1
,但实际上会产生[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
。
最后,要回答您的问题,即使您仅设置I
的对角线条目,实际上也是设置I
的所有元素,因为每一行在内存中都是相同的。 Omari Celestine之所以行之有效,是因为它为每一行分配了一个新的内存部分,而不只是一个内存部分。