我正在尝试查找矩阵是否对角占优。 我已经开发了如下代码。
sum=0
def isDiagonallyDominantMatrix(A):
global sum
for i in range(len(A)):
for j in range(len(A)):
sum=sum+abs(A[i][j])
diag=abs(A[i][i])
non_diag=sum-diag
if((diag<non_diag)):
return 0
return 1
A=[[7,2,1],[1,7,2],[1,2,7]]
if(isDiagonallyDominantMatrix(A)):
print('yes')
else:
print('no')
每当我运行上面的代码时,尽管A矩阵对角占主导地位,但仍显示'no'。请问在我犯错的地方可以帮忙
答案 0 :(得分:3)
在Wikipedia中有关什么是对角占优矩阵(link)的示例之后,为什么拥有sum
全局变量? sum
仅需要为每一行计算:
A=[[7,2,1],
[1,7,2],
[1,2,7]]
def isDiagonallyDominantMatrix(A):
for i, row in enumerate(A):
s = sum(abs(v) for j, v in enumerate(row) if i != j)
if s > abs(row[i]):
return False
return True
if(isDiagonallyDominantMatrix(A)):
print('yes')
else:
print('no')
此打印:
yes
注意:请勿使用0
或1
来表示False
或True
。 Python具有常量。
答案 1 :(得分:0)
另一种使用numpy的方法将矩阵与其对角线分开并进行比较(对于较大的矩阵可能会更快):
A = [[7,2,1],
[1,7,2],
[1,2,7]]
def is_diagonal(A):
A = np.abs(np.asarray(A)) # converts lists to numpy arrays
diagonal = np.diag(A) # [7, 7, 7]
others = A - np.diag(diagonal) # matrix 'A' but with zeros along the diagonal
return np.all(diagonal >= others.sum(axis=1))
is_diagonal(A)
True
函数中的return np.all(...)
行测试从矩阵对角线拉出的每个元素是否大于或等于该行中其余元素的总和。如果用于所有行,则返回true。如果 any 行的结果为false,则返回false。
请注意,当我们将输入转换为numpy数组时,我们也会采用其绝对值。这是因为we need the absolute value for our sum to say whether the matrix is diagonally dominant。
更加简洁:
def is_diagonal(A):
A = np.abs(np.asarray(A))
return np.all(np.diag(A) >= A.sum(axis=1) / 2)
第二个选项之所以有效,是因为为了使该行中的任何个单个元素大于或等于所有 other 个元素的总和, 必须为真,单个元素大于或等于所有元素之和的一半。