检查矩阵是否在 python 中对角占优势

checking if a matrix is diagonally dominant in python

我知道我的代码是错误的,因为 np.sum(abs(X),axis=1)) 也对对角线值求和,因此我的代码总是 return 'NOT diagonally dominant' .我尝试输入 '-np.diag(X)' 但我收到一条错误消息。提前致谢!

import numpy as np

A=np.array([[ 40., 7.,   5.],
               [ 5., 90.,  7.],
               [20., 7., 50.]])


def dd(X):
    Sum_values_in_given_row = np.sum(abs(X),axis=1) 
    if np.all(((abs(np.diag(X)))) >= np.sum(abs(X),axis=1)):
        print 'matrix is diagonally dominant'
    else:
        print 'NOT diagonally dominant'
    return

dd(A)

怎么了

matrix = [[ 40., 7.,   5.],
               [ 5., 90.,  7.],
               [20., 7., 50.]]

def dd(mat):
        for numb, i in enumerate(mat):
                if mat[numb][numb]<sum(i)-mat[numb][numb]:
                        return False
        return True


print(dd(matrix))

如果 |Aii|,矩阵 A 是对角占优的≥ ∑j≠i |Aij|,或等价地,2|Aii| ≥ ∑j |Aij|.

def is_diagonally_dominant(x):
    abs_x = np.abs(x)
    return np.all( 2*np.diag(abs_x) >= np.sum(abs_x, axis=1) )
#                  ^^

要确定一个矩阵是否对角占优,你必须检查不包括对角系数的行系数之和是否大于对角系数。显然,您将绝对值作为测试的一部分。您没有这样做,而是包括了对角线系数。正如您提到的,您应该用对角系数减去每个元素的总和以确保检查正确,但出于某种原因您没有将其放入代码中:

def dd(X):
    D = np.diag(np.abs(X)) # Find diagonal coefficients
    S = np.sum(np.abs(X), axis=1) - D # Find row sum without diagonal
    if np.all(D > S):
        print 'matrix is diagonally dominant'
    else:
        print 'NOT diagonally dominant'
    return

请注意,代码利用广播来方便地用相应的对角系数减去行总和。