I want to generate a large number $k$ of vectors of norm 1 in a $d$ dimensional vector space such that $k>d$. I want these vectors to have inner products as small as possible.
A crude way is to generate random vectors using RandomPoint
. Basically I am selecting 300 random vectors from a 100 dimensional sphere.
v = RandomPoint[Sphere[100],300] /. {x_?NumericQ :> x Exp[I RandomReal[{0, 2 Pi}]]}
A matrix is constructed by taking the inner products of these random vectors.
M = Outer[Abs@*Dot, Conjugate[v], v, 1]
Since the norm of each vector is 1, the diagonal elements are 1. Also since the sphere's dimension is 100, the rank of this matrix is 100. In addition to the diagonal components, there are various non zero diagonal components, which are basically these non zero inner products.
Equivalently, it is helpful to visualize this using the list density plots as indicated in this answer.
ListDensityPlot[M, PlotLegends -> Automatic, ScalingFunctions -> "Log"]
What I am aiming for in the above figure is mostly blue off diagonal elements, while still maintaining the $x=y$ white line. Another way to visualize this by looking at the histogram at the $y =50$ slicing,
What I want to get in this histogram is that most of the elements are close to zero, while still maintaining the element at 1.
There are two ways to do so:
Can I constrain the vector generation from the beginning itself in such a way that the inner products between the vectors are close to zero? Basically is there a better way of generating such vectors than randomly generating them?
Using techniques such as row reduction, is it possible to reduce the norm of most of the off diagonal components (preferably very close to zero) of the matrix M, while strictly maintaining the diagonal entries to be 1?
Note that I am not taking about diagonalizing the matrix, for if one attempts to diagonalize M, we will have only 100 entries which are 1, and not all 300.