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

时间:2017-03-28 16:10:09

标签: python numpy matrix linear-algebra

我知道我的代码是错误的,因为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 个答案:

答案 0 :(得分:4)

如果| A ii |矩阵 A 是对角占优势的。 ≥Σ j≠i | A ij |,或等效地,2 | A ii | ≥Σ j | A ij |。

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 :(得分:3)

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

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

注意,代码利用广播来便于用对应的对角线系数减去行和。

答案 2 :(得分:0)

有什么问题
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))