2017-03-28 122 views
1

我知道我的代码是错误的,因为np.sum(abs(X),axis = 1))也会将对角线值相加,因此我的代码将始终返回'NOT diagonally dominant ”。我曾尝试把'-np.diag(X)',但我得到一个错误消息。先谢谢你!检查矩阵在Python中是否对角占优

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

要确定矩阵是对角占优的,你必须检查是否排除行系数的总和对角线系数比对角线系数较大。显然,您将绝对值作为测试的一部分。你不这样做,而是包括对角线系数。正如你所说,你应该减去各部件的这总和与对角线系数,以确保检验结果是正确的,但是你没有把在你的代码由于某些原因:

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

+0

不客气!很高兴我能帮上忙。 – rayryeng

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

因为它不是很NumPy-ish。 – rayryeng

3

矩阵一个是,如果对角占优| A II | ≥Σ 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)) 
#     ^^