在Python中检查矩阵是否为对角占优

4

我知道我的代码有误,因为np.sum(abs(X),axis=1))也会将对角线的值加起来,因此我的代码总是返回“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)
3个回答

6
要确定矩阵是否具有对角线优势,您需要检查行系数之和(不包括对角线系数)是否大于对角线系数。显然,您需要在测试中考虑绝对值。但是您没有这样做,反而包括了对角线系数。正如您所提到的,为确保检查正确,您应该将每个元素与对角线系数相减,但出于某种原因,您没有在代码中实现这一点。
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

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

1
谢谢!那非常有帮助! :) - Kate

5
矩阵 A 满足 |Aii| ≥ ∑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) )
#                  ^^

1

有什么问题

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

1
因为它不太像NumPy。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接