该程序测试矩阵是否是单位矩阵。
我已将代码粘贴在下方,并想知道如何优化此代码的效率。另外我是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
答案 0 :(得分: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
评估对角线上的True
和其他地方的False
。在Python中,True == 1
和False == 0
,您可以比较val == (x == y)
。括号很重要:
val == x == y
将是与val == x and x == y
答案 1 :(得分:6)
我会使用numpy
:
(np.array(matrix1) == np.identity(len(matrix1))).all()
当然,如果您首先将matrix1
存储为numpy数组以避免转换,那会更好。
答案 2 :(得分:1)
乘以所有的向量并检查结果是否相同
答案 3 :(得分:1)
检查矩阵的大小,确保它是n x n,然后使用np.identity(n)创建一个实际的单位矩阵,然后将矩阵与您创建的矩阵进行比较。
答案 4 :(得分: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
答案 5 :(得分: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