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