【问题标题】:Normalize a symmetric matrix by fixing unique diagonal value通过固定唯一的对角线值来归一化对称矩阵
【发布时间】:2021-01-11 22:49:23
【问题描述】:

我有一个对称矩阵a,它的对角线元素可以不同。

>>> import numpy as np
>>> a = np.array([[3, 7, 6], [7, 2, 5], [6, 5, 1]])
>>> a
array([[3, 7, 6],
       [7, 2, 5],
       [6, 5, 1]])

我想对这个矩阵进行归一化,使所有对角线元素都为 0,如下所示:

array([[0, x1, x2],
       [x1, 0, x3],
       [x2, x3, 0]])

我该怎么做(如果可能,在 Python 中)? 任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 感谢您的回答,但我应该指定更多。我的目标不是填充对角线。我想根据对角线对所有矩阵元素进行归一化,例如:A = np.multiply(a, X) ,a=输入矩阵,A=输出矩阵,对角线值 = 0(注意,我使用的矩阵大小为 20*20)
  • 所以给定了 a 和 A,你想找到一个矩阵 X 使得 A = np.multiply(a, X)? (顺便问一下,你的意思是 np.multiply 还是 np.dot)?
  • 抱歉,np.dot(a, X)X 未知。我们只知道输入矩阵a 和输出矩阵A 的对角线为零。
  • 我更新了最初的答案;那是你需要的吗?您的问题是否还有其他假设/细节需要考虑?

标签: python matrix normalization diagonal symmetric


【解决方案1】:

您可以使用以下命令:np.fill_diagonal(a, 0) (https://numpy.org/doc/stable/reference/generated/numpy.fill_diagonal.html)


按照您的说明:如果我很了解您想要做什么,那么您可以区分两种情况。

  • 可逆 ==> 使用X = np.linalg.solve(a, A)
  • 可逆 ==>在这种情况下,可能没有解,也可能有无限多个解。

例如,如果 a 不可逆但 A 可逆,则 无解(否则 X*A^-1 将为 a 提供逆)。一般来说,解存在的必要条件是 rk(A)

在另一种情况下,有无限多的解决方案

a = array([[0, 0, 0],
           [0, 2, 0],
           [0, 0, 1]])

A = array([[0., 0., 0.],
           [0., 0., 1.],
           [0., 1., 0.]])

因为

    array([[0. , 0. , 0. ],              array([[1., 1., 1.],
X =        [0. , 0. , 0.5],     + lbda *        [0., 0., 0.],
           [0. , 1. , 0. ]])                    [0., 0., 0.]])

为 lbda 的每个实数值求解 np.dot(a,X) = A

如果你是第二种情况(无限多的解决方案),你可以使用

X = np.linalg.lstsq(a,A)[0]

即使在 a 不可逆的情况下也提供解决方案(如果 a 是可逆的,则返回与 np.linalg.solve 相同的结果)。 如果不存在解决方案,此命令将返回一个矩阵,使得 np.dot(a,X) 与 A“尽可能接近”。您可以通过添加像 assert np.max(np.abs(np.dot(a,X) - A)) < 1E-5 这样的最终检查来实现这种情况。

【讨论】:

  • 感谢您的回答。问题是我们也不知道A:我们希望它的对角线为零,但我们不知道其他元素的值。这个系统有太多的未知数。我将尝试找到一个解决方案来应用初始矩阵 a 而无需归一化。无论如何,非常感谢您的宝贵解释,我学到了很多!
【解决方案2】:

如果你想让所有对角线元素都为0,只需使用一个简单的for-loop即可。

for i in range(len(matrix)):
    matrix[i][i] = 0

【讨论】:

  • 关于 numpy 的 惊人 之处在于您不必使用循环来更改数组。这是更改 numpy 数组的错误方法
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2016-04-14
  • 2019-10-02
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多