此python代码应检查矩阵对称性,如果对称则返回1,如果倾斜对称则返回-1,否则返回0。 我的代码总是返回1。怎么会这样?
N=3
def isSymmetric(mat,N):
for i in range(N):
for j in range(N):
return (mat[i][j] == mat[j][i])
def isSkew(mat,N):
for i in range(N):
for j in range(N):
return (mat[i][j]==-mat[j][i])
def test(mat,N):
if isSymmetric(mat,N):
return 1
if isSkew(mat,N):
return -1
else:
return 0;
# Driver code
mat = [ [0,1,0 ], [ 4,4,3 ], [5,4,6 ] ]
print(test(isSymmetric(mat,N)))
答案 0 :(得分:0)
您的代码逻辑有点混乱。每个函数都返回一个布尔值,而前两个函数仅在返回值并停止运行之前运行一次比较。他们实际上并没有看整个矩阵,即使返回,您返回的内容也没有任何意义。一个好的经验法则是将赋值(=)运算符视为声明(您是团队负责人),将相等(==)运算符视为提问(您是团队负责人吗?)。您可以使用它来检查值是否相等,而不是断言它们是否相等。
如果您说return x==y
,您将得到的只是一个布尔值,它告诉您这些变量是否存储相同的值,并且在循环的情况下,它们总是会存储。这是因为mat [0] [0](mat [i] [j]的第一个元素)将始终等于mat [0] [0](mat [j] [i]的第一个元素)。您希望前两个函数要做的是生成转置矩阵和负转置矩阵。然后,您的测试功能可以针对原始矩阵测试这些矩阵,并查看它们是对称的还是偏斜的。这有效:
def isSymmetric(mat, N):
newmat = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(N):
for j in range(N):
newmat[i][j] = mat[j][i]
return newmat
def isSkew(mat, N):
newmat = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(N):
for j in range(N):
newmat[i][j] = -mat[j][i]
return newmat
def test(mat, N):
if isSymmetric(mat, N) == mat:
return 1
if isSkew(mat, N) == mat:
return -1
else:
return 0;
N = 3
mat = [[0, 1, -2], [-1, 0, 3], [2, -3, 0]]
print(test(mat, N))
>>> -1
N = 3
mat = [[1, 1, -1], [1, 2, 0], [-1, 0, 5]]
print(test(mat, N))
>>> 1
N = 3
mat = [[1, 1, -1], [11, 2, 0], [4, 9, 5]]
print(test(mat, N))
>>> 0