2017-03-28 1 views
1

Je sais que mon code est faux parce que np.sum (abs (X), axe = 1)) résume aussi la valeur diagonale, donc mon code retournera toujours 'NON diagonalement dominant '. J'ai essayé de mettre '-np.diag (X)' mais j'ai un message d'erreur. Merci d'avance!vérifier si une matrice est diagonalement dominante en 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) 

Répondre

3

Pour déterminer si une matrice est diagonale dominante, vous devez vérifier si la somme des coefficients de ligne à l'exclusion le coefficient diagonal est supérieur au coefficient diagonale. Évidemment, vous prenez les valeurs absolues dans le cadre du test. Vous ne faites pas cela et vous incluez le coefficient diagonal à la place. Comme vous l'avez mentionné, vous devez soustraire ce la somme de chaque élément avec le coefficient diagonal pour assurer le contrôle est correct, mais vous ne l'avez pas mis cela dans votre code pour une raison:

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 

Notez que le code prend avantage de la diffusion pour faciliter la soustraction des sommes des lignes avec le coefficient diagonal correspondant.

+1

Merci! C'était très utile! :) – Kate

+0

De rien! Heureux d'avoir pu aider. – rayryeng

0

Quel est le problème avec

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

Parce que ce n'est pas très NumPy-ish. – rayryeng

3

La matrice A est diagonale dominante si | A ii | ≥ Σ j ≠ i | A ij |, ou de manière équivalente, 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)) 
#     ^^