Untitled
unknown
python
a year ago
2.3 kB
5
Indexable
def ensure_nonzero_diagonal(matrix, size, index):
"""
Ensures that the diagonal element matrix[index, index] is non-zero. If zero,
swaps rows and columns with another non-zero element in the same row.
"""
# If the diagonal element is already non-zero, return the matrix unchanged.
if matrix[index][index] != 0:
return matrix, np.eye(size)
col = index + 1
# Search for a non-zero element in the row.
while col < size and matrix[index][col] == 0:
col += 1
# Construct an identity matrix to perform the swap.
transform = np.eye(size)
transform[col][index] = 1
# Apply row and column swaps.
matrix = transform.T @ matrix @ transform
return matrix, transform
def create_transformation(matrix, size, index):
"""
Creates a transformation matrix to eliminate off-diagonal elements in the row.
"""
transform = np.eye(size)
diag_element = matrix[index][index]
# Compute transformation values for off-diagonal elements in the row.
for col in range(index + 1, size):
transform[index][col] = -matrix[index][col] / diag_element
return transform
def symmetric_diagonalization(matrix):
"""
Diagonalizes a symmetric matrix by sequentially eliminating off-diagonal entries.
"""
# Validate symmetry of the matrix.
if not np.array_equal(matrix, matrix.T):
return "Error: Input matrix is not symmetric."
size = len(matrix)
combined_transform = np.eye(size)
# Iterate through rows to diagonalize the matrix.
for row in range(size - 1):
matrix, temp_transform = ensure_nonzero_diagonal(matrix, size, row)
combined_transform = combined_transform @ temp_transform
row_transform = create_transformation(matrix, size, row)
combined_transform = combined_transform @ row_transform
matrix = row_transform.T @ matrix @ row_transform
return matrix, combined_transform
# Example input matrix and function call
input_matrix = np.array([
[1, 0, 0, 0],
[0, -4, 0, 0],
[0, 0, 0, -1/2],
[0, 0, -0.5, 16]
])
diagonalized, transformation_matrix = symmetric_diagonalization(input_matrix)
print("Original matrix: \n", input_matrix)
print("Diagonalized matrix: \n", diagonalized)
print("Transformation matrix: \n", transformation_matrix)
Editor is loading...
Leave a Comment