2015-10-15 73 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