我在名为LU.py的文件中定义了一个函数(crout),在另一个文件(invert.py)中定义了另一个函数。文件的内容是:
LU.py
def crout(A,L,U):
N = len(A)
add = 0
#print(L,U)
for i in range(N):
print('b',L[i][i])
U[i][i] = 1
print('a',L[i][i])
#print(L,U)
和invert.py
import LU
def inverse(A):
n = len(A)
B = []
L = []
U = []
for i in range(n):
row = [0 for j in range(n)]
B.append(row)
L.append(row)
U.append(row)
LU.crout(A,L,U)
return B
M = [[1,2,3],[1,0,1],[2,2,0]]
Mi = inverse(M)
A = [[1,2,3],[1,0,1],[2,2,0]]
L = [[0,0,0],[0,0,0],[0,0,0]]
U = [[0,0,0],[0,0,0],[0,0,0]]
print('bla')
LU.crout(A,L,U)
请注意,我从反转文件中运行了两次函数crout,一次从反函数运行,一次从函数外部运行。 接下来,我在ubuntu linux机器上使用python 2.7.6运行invert.py文件,我得到以下输出:
('b',0)
('a',1)
('b',0)
('a',1)
('b',0)
('a',1)
bla
('b',0)
('a',0)
('b',0)
('a',0)
('b',0)
('a',0)
'bla'之前的数字是反向内部的crout调用,表示数组L中对角线的元素。请注意,这些值从0('b')变为1('a')为我改变了U中的值(当然不应该发生!)。另一方面,当我从函数反向外部调用crout时,L中的值在更改U后保持不变,这当然是应该发生的。
非常感谢任何关于为什么会发生这种情况的想法!
卡洛斯
答案 0 :(得分:1)
在inverse
中,您将append
行变量分别设置为B,L和U.
for i in range(n):
row = [0 for j in range(n)]
B.append(row)
L.append(row)
U.append(row)
现在每个列表都包含对相同row
值的引用。更改其中一个列表中的值将更改彼此的值。如果这不是所需的行为,请为每个列表创建一个新行。
for i in range(n):
B.append([0 for j in range(n)])
L.append([0 for j in range(n)])
U.append([0 for j in range(n)])
如果这看起来有点不合适,那么为矩阵创建逻辑创建一个独立的函数可能会很有用。
def make_square_matrix(size):
return [[0]*size for b in range(size)]
def inverse(A):
n = len(A)
B = make_square_matrix(n)
L = make_square_matrix(n)
U = make_square_matrix(n)
LU.crout(A,L,U)
return B