该程序测试矩阵是否是单位矩阵.
我已将代码粘贴在下面,并想知道如何优化此代码的效率.另外我是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
Run Code Online (Sandbox Code Playgroud)
Jan*_*ila 13
def is_identity_matrix(listoflist):
return all(val == (x == y)
for y, row in enumerate(listoflist)
for x, val in enumerate(row))
Run Code Online (Sandbox Code Playgroud)
(但是,这不检查矩阵是否为正方形,并且对于空列表返回True)
说明:在内部,all我们有一个带有嵌套循环的生成器表达式,其中val循环遍历矩阵中的每个值.x == y评估True对角线和False其他地方.在Python,True == 1和False == 0,这样你可以比较val == (x == y).括号很重要:
val == x == y将是一个相当于的链式比较val == x and x == y
我用的是numpy:
(np.array(matrix1) == np.identity(len(matrix1))).all()
Run Code Online (Sandbox Code Playgroud)
当然,如果你首先存储matrix1为一个numpy数组以避免转换,那会更好.