我正在尝试编写一个函数,该函数将能够检查用户输入的矩阵的对称性。如果矩阵是对称的,则打印true。如果不是,则打印false。
def symmetric(mat, N):
for i in range(N):
for j in range(N):
if (mat[i][j] != mat[j][i]):
return False
return True
mat = []
if (symmetric(mat, 3)):
print ('true')
else:
print ('false')
一旦我添加了mat = []
,问题就开始了。运行该函数后,将显示IndexError: list index out of range
。
我添加了一个预定义的矩阵mat = [[1, 2, 3], [2, 5, 4], [3, 4, 7]]
,它可以正常工作,但是我需要用户输入矩阵
最终结果应与此类似
>>> m1 = [[1, 2, 3], [2, 5, 4], [3, 4, 7]]
>>> symmetric(m1)
True
答案 0 :(得分:1)
使用numpy array可能会更有帮助。它允许您利用shape
属性检查矩阵是否为正方形,然后无需输入尺寸大小
import numpy as np
mat = np.array([[1, 2, 3], [2, 5, 4], [3, 4, 7]])
def symmetric(mat):
rows, cols = mat.shape
if rows != cols:
raise ValueError("Invalid matrix isn't square")
for i in range(rows):
for j in range(cols):
if (mat[i][j] != mat[j][i]):
return False
return True
try:
is_symmetric = symmetric(mat)
except ValueError as e:
print(e)
Numpy是pip install
所需要的软件包,但这使您可以很容易地抢先处理非正方形的情况。此外,allclose
函数可让您快速检查数组的对称性质,如this question中所述,或如@Sheldore建议的那样:
def symmetric(mat):
if (mat.T == mat).all():
return True
return False
mat = np.array([[1, 2, 3], [2, 5, 4], [3, 4, 7]])
您可以结合使用列表理解方法和all
操作:
def symmetric(mat, N):
# This is a pretty naive way to check the dimensions in a similar fashion
# as np.shape, but this gets the thought process across
row, col = len(mat[0][:]), len(mat[:][0])
if row != col:
raise ValueError("Non-square matrix is invalid")
if all([mat[i][j] == mat[j][i] for i, j in zip(range(row), range(col))]:
return True
return False
答案 1 :(得分:0)
mat = []
try:
if (symmetric(mat, 3)):
print ('true')
else:
print ('false')
except IndexError:
print('Invalid matrix, try again')
答案 2 :(得分:0)
您可以使用基本的try
和except
来解决这种情况。但是,您应该不在常规代码中执行此操作。使用您的函数来实现此目的:
def symmetric(mat, N):
try:
for i in range(N):
for j in range(N):
if (mat[i][j] != mat[j][i]):
return False
return True
except IndexError:
print('Invalid input.')
这样,无论调用函数多少次,您都可以忽略用户输入错误的情况。