2

这个程序测试一个矩阵是否是一个单位矩阵。

我在下面粘贴了我的代码,并想知道如何优化此代码的效率。另外我是python编程的新手,是否有一些内置函数也可以解决这个目的?

    def is_identity_matrix(test):
    if (test == []):
        return False
    i = 0
    while (i < len(test)):
        if (len(test[i]) == len(test)):
            j = 0
            while(j < len(test[i])):
                if (j != i):
                    if(test[i][j] != 0):
                        return False
                else:
                    if(test[i][j] != 1):
                        return False
                if(j == (len(test[i]) - 1)):
                    break
                j += 1
            if(i == (len(test) - 1)):
                break
            i += 1
        else:
            return False
    if(i == j and i == (len(test) - 1)):
        return True

# Test Cases:

matrix1 = [[1,0,0,0],
           [0,1,0,0],
           [0,0,1,0],
           [0,0,0,1]]
print is_identity_matrix(matrix1)
#>>>True

matrix2 = [[1,0,0],
           [0,1,0],
           [0,0,0]]

print is_identity_matrix(matrix2)
#>>>False

matrix3 = [[2,0,0],
           [0,2,0],
           [0,0,2]]

print is_identity_matrix(matrix3)
#>>>False

matrix4 = [[1,0,0,0],
           [0,1,1,0],
           [0,0,0,1]]

print is_identity_matrix(matrix4)
#>>>False

matrix5 = [[1,0,0,0,0,0,0,0,0]]

print is_identity_matrix(matrix5)
#>>>False

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

print is_identity_matrix(matrix6)
#>>>False
4

6 回答 6

13
def is_identity_matrix(listoflist):
    return all(val == (x == y) 
        for y, row in enumerate(listoflist)  
            for x, val in enumerate(row))

(虽然,这不会检查矩阵是否为正方形,并且对于空列表返回 True)

解释:在里面all我们有一个带有嵌套循环的生成器表达式,其中val循环遍历矩阵中的每个值。在对角线和其他地方x == y求值。在 Python 中,和,所以你可以比较. 括号很重要: 将是等效于的链式比较TrueFalseTrue == 1False == 0val == (x == y)val == x == yval == x and x == y

于 2013-05-17T17:00:49.767 回答
6

我会使用numpy

(np.array(matrix1) == np.identity(len(matrix1))).all()

当然,如果您首先存储matrix1为 numpy 数组以避免转换,那会更好。

于 2013-05-17T16:55:00.610 回答
1

乘以全向量并检查结果是否相同

于 2013-05-17T16:55:13.230 回答
1

检查矩阵的大小,确保它是 nxn,然后使用 np.identity(n) 创建一个实际的单位矩阵,然后将您的矩阵与您创建的新矩阵进行比较。

于 2013-05-17T17:00:26.537 回答
1
def is_identity_matrix(test):
    if not test : return False
    le = len(test[0])
    for i,x in enumerate(test):
        if len(x) == le:
            if any(y!=1 if j==i else y!=0 for j,y in enumerate(x)):
                return False
        else:
            return False
    return True if len(test) == le else False
于 2013-05-17T17:14:40.373 回答
0

如果速度很重要,您可能应该查看 Numpy,但在您不能使用它的情况下,或者将矩阵作为 Numpy 数组可能不值得,您也可以使用以下内容:

def is_identity(mat):
    for i, row in enumerate(mat):
        if any(row[:i]) or row[i]!=1 or any(row[i+1:]):
            return False
    return True

比当前接受的答案的代码快大约 12 倍!对于至少 2000x2000 的矩阵...

以上不检查矩阵尺寸,但您可以轻松添加如下内容:

n = len(matrix)
if not all(len(row) == n for row in matrix):
    return False
于 2013-11-13T23:13:03.480 回答