3

我正在尝试编写一个函数来检查用户输入的矩阵的对称性。如果矩阵是对称的,则打印 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
4

3 回答 3

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中提到的数组的对称性质,或者如@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
于 2019-04-13T20:57:31.543 回答
0
mat = []
try:
    if (symmetric(mat, 3)): 
        print ('true')
    else: 
        print ('false')
except IndexError:
    print('Invalid matrix, try again')
于 2019-04-13T20:49:13.257 回答
0

您可以使用基本的tryexcept来捕捉这种情况。但是,您不应该正常代码中执行此操作。使用你的函数来实现这个:

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.')

这样,无论您调用函数多少次,您都可以忘记错误的用户输入。

于 2019-04-13T20:54:20.307 回答