2017-03-28 63 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)) 
#     ^^