Source code for toqito.matrix_props.spark

"""Computes the spark of a matrix."""

from itertools import combinations

import numpy as np


[docs] def spark(mat: np.ndarray) -> int: """Compute the spark of a matrix. The spark of a matrix A is the smallest number of columns from A that are linearly dependent [@Elad_2010_Sparse]. Examples: ```python exec="1" source="above" import numpy as np from toqito.matrix_props import spark A = np.array([[1, 0, 1, 2], [0, 1, 1, 3], [1, 1, 2, 5]]) print(spark(A)) ``` Notes: - This function only works for 2D NumPy arrays. - If all columns are linearly independent, the function returns n_cols + 1. - The time complexity of this implementation is O(2^n) in the worst case, where n is the number of columns. - For an m x n matrix A with n >= m: - If spark(A) = m + 1, then rank(A) = m (full rank). - If spark(A) = 1, then the matrix has a zero column. - If spark(A) <= rank(A) + 1, then the matrix has dependent columns. Raises: ValueError: If the input is not a 2D NumPy array. Args: mat: The input matrix as a 2D NumPy array. Returns: The spark of the input matrix `mat`. """ if not isinstance(mat, np.ndarray) or mat.ndim != 2: raise ValueError("Input must be a 2D NumPy array") m, n_cols = mat.shape # Check for zero columns if np.any(np.all(mat == 0, axis=0)): return 1 for k in range(1, min(m, n_cols) + 1): for cols in combinations(range(n_cols), k): submatrix = mat[:, cols] if np.linalg.matrix_rank(submatrix) < k: return k # If all columns are linearly independent return min(m, n_cols) + 1