(python矩阵检查对称性)无论矩阵输入为何为何都返回1?

时间:2019-03-19 22:00:13

标签: python matrix symmetric

此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)))

1 个答案:

答案 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