嵌套循环在执行布尔矩阵乘法时更改多个值
Nested loop changing multiple values while doing Boolean matrix multiplication
编写一个函数,将两个矩阵 (A,B) 相乘,returns 结果。 A 和 B 都是二维列表,并且具有兼容的乘法维度
我的代码将 0 和 1 转换为 true 和 false,然后将它们相乘,然后再将其转换回来。
def matrix_multiply_boolean(A,B):
#converts to boolean
ra = len(A)
ca = len(A[0])
rb = len(B)
cb = len(B[0])
for i in range(ra):
for z in range(ca):
# print (A[i][z])
if A[i][z]==0:
A[i][z]=False
if A[i][z]==1:
A[i][z]=True
for i in range(rb):
for z in range(cb):
print (B[i][z])
if B[i][z]==0:
B[i][z]=False
if B[i][z]==1:
B[i][z]=True
#print(A)
#print(B)
#compares True and False vlaues
#cant figure out why when the function cycles throught the first z #it sets two valeus to true
new_list = [[True] * cb] * ra
for z in range(ra):
for i in range(cb): # *****on the second loop around the value of two #elements change and I have no idea why*****
value = False
for j in range(ca):
value = value or A[z][j] and B[j][i]
print (value,j) #shows the value and how many times its been #throgh the loop. goes 3 times
new_list[z][i] = value #changes the value in the list
print("newlist ",new_list[z][i]) # shows the value that was set #from line 59
print(new_list) # shows you the list at the end of one whole #calculation
#converts funtion back to boolean numbers
rnl = len(new_list)
cnl = len(new_list[0])
for i in range(rnl):
for z in range(cnl):
#print (new_list[i][z])
if new_list[i][z]==False:
new_list[i][z]=0
if new_list[i][z]==True:
new_list[i][z]=1
return new_list
A= [ [0,1,1],[1,0,0]]
B= [ [1,0],[0,0],[0,1]]
print(matrix_multiply_boolean(A,B))
乘法完成后我得到了正确的布尔值,但设置不正确,我不明白为什么。发生的事情是在一行完成后开始新的一行,并在下一次乘法完成时更改 [1,0](当前行)和 [0,0](前一行同一列)的值只是 [1,0]。由于某种原因,这只发生在循环的第一个元素上
预期值 [[0,1],[1,0]]
实际值 [[1, 0], [1,0]]
改变
new_list = [[True] * cb] * ra
到
new_list = [[True for j in range(0, cb)] for i in range(0, ra)]
它输出了想要的结果。
存储在new_list
中的对象不仅仅是彼此的副本,而且实际上是相同的对象。使用您的示例(其中 cb == 2
和 ra == 2
)new_list
在内部看起来像这样:
[[A, B], [A, B]]
其中 A
和 B
都是布尔值,值为 True
。现在,当您更改 A
时,new_list
会在两个地方更改,因为它们每个都引用同一个对象 A
。 B
也是如此。 new_list
中存储的两个列表与您的代码始终相同。
编写一个函数,将两个矩阵 (A,B) 相乘,returns 结果。 A 和 B 都是二维列表,并且具有兼容的乘法维度
我的代码将 0 和 1 转换为 true 和 false,然后将它们相乘,然后再将其转换回来。
def matrix_multiply_boolean(A,B):
#converts to boolean
ra = len(A)
ca = len(A[0])
rb = len(B)
cb = len(B[0])
for i in range(ra):
for z in range(ca):
# print (A[i][z])
if A[i][z]==0:
A[i][z]=False
if A[i][z]==1:
A[i][z]=True
for i in range(rb):
for z in range(cb):
print (B[i][z])
if B[i][z]==0:
B[i][z]=False
if B[i][z]==1:
B[i][z]=True
#print(A)
#print(B)
#compares True and False vlaues
#cant figure out why when the function cycles throught the first z #it sets two valeus to true
new_list = [[True] * cb] * ra
for z in range(ra):
for i in range(cb): # *****on the second loop around the value of two #elements change and I have no idea why*****
value = False
for j in range(ca):
value = value or A[z][j] and B[j][i]
print (value,j) #shows the value and how many times its been #throgh the loop. goes 3 times
new_list[z][i] = value #changes the value in the list
print("newlist ",new_list[z][i]) # shows the value that was set #from line 59
print(new_list) # shows you the list at the end of one whole #calculation
#converts funtion back to boolean numbers
rnl = len(new_list)
cnl = len(new_list[0])
for i in range(rnl):
for z in range(cnl):
#print (new_list[i][z])
if new_list[i][z]==False:
new_list[i][z]=0
if new_list[i][z]==True:
new_list[i][z]=1
return new_list
A= [ [0,1,1],[1,0,0]]
B= [ [1,0],[0,0],[0,1]]
print(matrix_multiply_boolean(A,B))
乘法完成后我得到了正确的布尔值,但设置不正确,我不明白为什么。发生的事情是在一行完成后开始新的一行,并在下一次乘法完成时更改 [1,0](当前行)和 [0,0](前一行同一列)的值只是 [1,0]。由于某种原因,这只发生在循环的第一个元素上
预期值 [[0,1],[1,0]]
实际值 [[1, 0], [1,0]]
改变
new_list = [[True] * cb] * ra
到
new_list = [[True for j in range(0, cb)] for i in range(0, ra)]
它输出了想要的结果。
存储在new_list
中的对象不仅仅是彼此的副本,而且实际上是相同的对象。使用您的示例(其中 cb == 2
和 ra == 2
)new_list
在内部看起来像这样:
[[A, B], [A, B]]
其中 A
和 B
都是布尔值,值为 True
。现在,当您更改 A
时,new_list
会在两个地方更改,因为它们每个都引用同一个对象 A
。 B
也是如此。 new_list
中存储的两个列表与您的代码始终相同。