Source code for toqito.matrix_props.mutual_coherence

"""Computes the mutual coherence for a list of 1D numpy arrays."""

import numpy as np


[docs] def mutual_coherence(vectors: list[np.ndarray]) -> float | np.floating: r"""Calculate the mutual coherence of a collection of input vectors. The mutual coherence of a collection of input vectors is defined as the maximum absolute value of the inner product between any two distinct vectors, divided by the product of their normsĀ [@WikiMutualCoh]. It provides a measure of how similar the vectors are to each other. Examples: ```python exec="1" source="above" import numpy as np from toqito.matrix_props.mutual_coherence import mutual_coherence example_A = [np.array([1, 0]), np.array([0, 1])] print("Result for example_A = ",mutual_coherence(example_A)) # An example with a larger set of vectors example_B = [np.array([1, 0, 1]), np.array([0, 1, 1]), np.array([1, 1, 0])] print("Result for example_B = ",mutual_coherence(example_B)) ``` Raises: ValueError: If arrays in list are not 1D. TypeError: If input is not a list. Args: vectors: A list of 1D numpy arrays. Returns: The mutual coherence of the collection of input vectors. """ # Check if the input is a valid list of 1D numpy arrays. if not isinstance(vectors, list): raise TypeError("Input must be a list of 1D numpy arrays.") if not all(isinstance(vec, np.ndarray) and vec.ndim == 1 for vec in vectors): raise ValueError("All elements in the list must be 1D numpy arrays.") # Convert input into a 2D numpy array. vectors = np.column_stack(vectors).astype(float) # Normalize the vectors. vectors /= np.linalg.norm(vectors, axis=0) # Calculate the inner product between all pairs of columns. inner_products = np.abs(np.conj(vectors.T) @ vectors) # Set diagonal elements to zero (only respecting distinct vectors). np.fill_diagonal(inner_products, 0) return inner_products.max()