簡體   English   中英

通過固定唯一對角線值來規范化對稱矩陣

[英]Normalize a symmetric matrix by fixing unique diagonal value

我有一個對稱矩陣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 中)? 任何幫助將不勝感激,謝謝。

如果你想讓所有對角線元素都為 0,只需使用一個簡單的for-loop

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

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


按照您的說明:如果我很了解您想要做什么,那么您可以區分兩種情況。

  • 可逆==> 使用X = np.linalg.solve(a, A)
  • a not invertible ==> 在這種情況下,可能沒有解決方案或無限多個解決方案。

例如,如果 a 不可逆但 A 可逆,則沒有解(否則 X*A^-1 將提供 a 的逆)。 一般來說,解存在的必要條件是rk(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.]])

np.dot(a,X) = A的每個實際值求解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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM