Я пытаюсь найти ранг матрицы, используя разложение LU. так как матрица не является полным рангом, то частичное и никакое поворотное не будет работать. Ниже приведена функция, созданная для полного поворота:
def LUPQdecomposition(matrix):
m,n = matrix.shape
P = np.identity(m)
L = np.identity(m)
Q = np.identity(n)
U = matrix.copy()
for k in range(0, n - 1):
max_magnitude_value = np.max(np.abs(U[k:,k]))
pivot_candidates = np.abs(np.copy(U[:,k]))
pivot_candidates[:k] = 0
(row_ids,) = np.where(pivot_candidates == max_magnitude_value)
pivot_row_id = max(k,row_ids[0])
pivot_col_id = k
pivot = U[pivot_row_id,pivot_col_id]
#row permutation matrix
p_k = np.eye(m)
save = p_k[k, :].copy()
p_k[k, :] = p_k[pivot_row_id, :]
p_k[pivot_row_id, :] = save
P = p_k@P
U = p_k@U
#column permutation matrix
q_k = np.eye(n)
save1 = q_k[:,k].copy()
q_k[:,k] = q_k[:,pivot_col_id]
q_k[:,pivot_col_id] = save1
Q = Q@q_k
U = U@q_k
for i in range(k+1,m-1):
if U[i,k] != 0.0:
multiplier = U[i,k]/pivot
L[i,k] = multiplier
for j in range(k,n-1):
U[i,j] -= U[k,j]*multiplier
L[:,:k] = p_k@L[:,:k]
rank = np.linalg.matrix_rank(U)
return(P,L,U,Q,rank)
P, L, U, Q, rank = LUPQdecomposition (b_mtrx)
Я действительно знаю, что проблема заключается в получении элемента поворота. Я не могу определить pivot_column_id и матрицу перестановок столбцов. Ошибка, которую я получаю, состоит в том, что U (верхняя матрица tri angular) не похожа на ту, что выводится из пакета scipy linalgebra. пожалуйста, дайте мне знать мою ошибку. рассмотрим следующую матрицу:
s_mtrx =
[[ 0. 0. 0. 1. 0. 0. 0. -1. 0. 0. 0. 0. 0. 1.]
[ 0. 0. 0. 0. 0. 0. 0. -1. 1. 0. 0. 0. 1. 0.]
[ 0. 0. 0. -1. 0. 1. 0. -1. 0. 0. 0. 0. 0. 0.]
[ 0. 0. -1. 1. 0. 0. 0. 1. 0. 0. 0. 0. 0. -1.]
[ 0. 0. 0. 0. 0. 0. 0. -1. -1. 0. 0. 0. 1. 1.]
[ 1. 0. 0. 0. 0. 0. 0. -1. 0. 0. 0. 0. -1. 1.]
[ 0. 0. 0. 1. 0. 0. 0. -1. 0. 0. 0. -1. 1. 0.]
[ 1. 0. 0. 0. 0. 0. 0. -1. 0. 0. 0. -1. 0. 0.]
[ 0. 0. 0. 2. -1. 0. 0. -1. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 1. -1. 0. 0. 0. 0. 0. 0. 0. 0. -1.]
[ 0. 0. 0. -1. 0. 0. 0. 0. 0. 1. 0. -1. 0. 0.]
[ 0. 1. 0. -1. -1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 1. 0. -1. 0. 0. 1. 0. 0. 0. -1. 0. 0. 0.]
[ 0. -1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -1.]
[ 0. 0. -1. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. -1.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -1. 1. -1.]
[ 0. 1. 0. 0. 0. 0. -1. 0. 0. 0. 0. 0. 0. -1.]
[ 1. 0. 0. 0. 0. 0. 0. 0. 0. -1. 0. 0. 0. -1.]
[ 0. -1. 0. 0. 0. 0. 0. 0. -1. 1. 0. 0. 0. 0.]
[ 0. 0. 0. 0. -1. 0. 2. 0. 0. 0. -1. 0. 0. 0.]]
это матрица 20x14. его ранг 12, но с моим кодом я получаю ранг, как 13. Было бы мило с вашей стороны. Спасибо и всего наилучшего