【问题标题】:checking if a matrix is diagonally dominant in python检查矩阵是否在python中对角占优
【发布时间】:2017-03-28 16:10:09
【问题描述】:

我知道我的代码是错误的,因为 np.sum(abs(X),axis=1)) 也会对对角线值求和,因此我的代码将始终返回“非对角线占优”。我尝试输入“-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)

【问题讨论】:

    标签: python numpy matrix linear-algebra


    【解决方案1】:

    要确定矩阵是否对角占优,您必须检查排除对角系数的行系数之和是否大于对角系数。显然,您将绝对值作为测试的一部分。您没有这样做,而是包括对角系数。正如你所提到的,你应该用对角系数减去每个元素的总和,以确保检查是正确的,但由于某种原因你没有把它放在你的代码中:

    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】:

    如果|Aii|,则矩阵A对角占优。 ≥ ∑j≠i |Aij|,或等价地,2|Aii| ≥ ∑j |Aij|.

    def is_diagonally_dominant(x):
        abs_x = np.abs(x)
        return np.all( 2*np.diag(abs_x) >= np.sum(abs_x, axis=1) )
    #                  ^^
    

    【讨论】:

      【解决方案3】:

      怎么了

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

      【讨论】:

      • 因为它不是很 NumPy-ish。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 2017-10-08
      • 1970-01-01
      • 2019-03-09
      • 2017-08-12
      • 1970-01-01
      • 2012-11-03
      相关资源
      最近更新 更多