How to "undo" an outer product

I have a matrix which is formed from the outer product of two complex vectors. There is some noise as well. How can I get the best estimate of the complex vector?

Here is a case without noise for a vector of length 6.

SeedRandom[123];
a = RandomComplex[{-1 - I, 1 + I}, 6];
b = Outer[Times, a, Conjugate[a]];


So the objective is to find the vector a from the matrix b.

I can get the magnitudes of the vector a from

diag = Sqrt[Re[Diagonal[b]]];


Although this is probably not the best estimate if there is noise. Here it works well

Abs[a] == diag


True

Now I need the best arguments of the vector. The outer product will give the differences of the arguments. This means that I probably can't get the exact arguments but I would be happy with the arguments relative to one unknown value. Any ideas on how to proceed with this?

Well, you can reconstruct a only up to a complex number of absolute value 1. You can use Eigensystem for that:

{\[Lambda], u} = Eigensystem[b, 1][[All, 1]];
v = u  Sqrt[\[Lambda]];
Norm[Outer[Times, v, Conjugate[v]] - b]


1.68349*10^-15

• I think, in some sense, that this is the best solution in the presence of noise. Commented Dec 11, 2019 at 21:18
• @mikado Do you mean in the least squares sense? How do you arrive at this thinking?
– Hugh
Commented Dec 12, 2019 at 14:26
• en.wikipedia.org/wiki/… Commented Dec 12, 2019 at 14:31