2015-10-15 44 views
0

当我在学习python时,我遇到了一个问题,一直无法确定哪里出了问题。请看下面的python代码。标识矩阵

def is_identity_matrix(matrix): 
    n = len(matrix) 
    if n != len(matrix[0]): 
     return False 
    i = 0 
    while i < n: 
     j = 0 
     while j < n: 
      if matrix[i][j] == matrix[i][i]: 
       if matrix[i][j] != 1: 
        return False 
      else: 
       if matrix[i][j] != 0: 
        return False 
      j+=1 
     i+=1 
    return True 

matrix6 = [[1,0,0,0], 
      [0,1,0,1], 
      [0,0,1,0], 
      [0,0,0,1]] 

print is_identity_matrix(matrix6) 

此输出True代替False因为这个问题是要求我们检查单位矩阵只有在中间的对角线应有1,剩下的应该是0。由于matrix[1][3]不等于1 ,输出应该是错误的。任何人都可以帮忙吗?非常感谢!

+5

不应该你的'如果矩阵[i] [j] ==矩阵[我] [我]:'是'如果我== j:'?和'我在范围内(n):'比'while'变种更加pythonic ... –

+0

明白了。这是照明。谢谢! – zero

回答

2

你应该比较i == j而不是matrix[i][j] == matrix[i][i]

这里的版本使用for而不是while

def is_identity_matrix(matrix): 
    n = len(matrix) 
    if n != len(matrix[0]): 
     return False 
    for i in range(n): 
     for j in range(n): 
      if i == j: 
       if matrix[i][j] != 1: 
        return False 
      else: 
       if matrix[i][j] != 0: 
        return False 
    return True 

甚至(使用productitertools),这节省了缩进层次,看起来更可读的对我说:现在

from itertools import product 

def is_identity_matrix(matrix): 
    n = len(matrix) 
    if n != len(matrix[0]): 
     return False 
    for i, j in product(range(n), range(n)): 
     if i == j: 
      if matrix[i][j] != 1: 
       return False 
     else: 
      if matrix[i][j] != 0: 
       return False 
    return True 
+0

在这种情况下,''i''和'[j]'会因为每次运行'for'而自动增加? – zero

+0

'i'(和'j'分别)将遍历所有从'0'到'n-1'的整数 - 这正是你'while'构造所做的。它更紧凑,让我感觉更自然。你甚至可以更加简化它,并在产品中使用'for i,j(范围(n),范围(n)):'(你必须先从'itertools import product'中得到'')。 –

+0

谢谢你给我看这个。我也去读了'range()'。谢谢! – zero

3

就像弘主角说,问题是在该行:

if matrix[i][j] == matrix[i][i]: 

如果一个单元格的值在对角线上,在这里我假设你要检查,如果你是对的值相匹配您正在检查或离开对角线。

该行应为:

if i == j: 
+0

明白了。谢谢! – zero

0

,如果你还没有学会范围(),就像我一样, 这里是我的解决方案:

def is_identity_matrix(matrix): 
    #Write your code here 
    n=len(matrix) 
    if n==len(matrix[0]): 
     i=0 
     while i<n: 
      j=0 
      while j<n: 
       if j==i: 
        if matrix[i][j]!=1: 
         return False 
       else: 
        if matrix[i][j]!=0 or matrix[j][i]!=0: 
         return False 
       j=j+1 
      i=i+1 
     else: 
      return True 
    else: 
     return False