单位矩阵

Identity matrix

在学习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,输出应该是false。有人可以帮忙吗?非常感谢!

就像hiro主角说的,问题出在线路上:

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

您正在检查单元格的值是否与对角线上的值匹配,我假设您要检查您是在对角线上还是在对角线上。

该行应为:

if i == j:

你应该比较 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

甚至(使用 itertools 中的 product)保存缩进级别并且对我来说看起来更具可读性:

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

如果你还没有学过range(),就像我现在一样, 这是我的解决方案:

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