How do I solve min ||y - A(x)||2 efficiently when A(x) is function (fourier ish) and x is large?

1 view (last 30 days)
How do I solve for min ||y - A(x)||2 efficiently when A(x) is function? A(x) is a fourier transform plus a few other little things (ie ifftshifts, multiplication). The number of unknowns is very large (x is large)
Ideally, I could use x = A\y. But I can't figure out how to do this. Even fminlbfgs_Kroon is super slow!
Thanks so much for your help!
Christine
  2 Comments
Matt J
Matt J on 9 Feb 2015
Christine, please use Comment boxes instead of Answer boxes to have a dialog with people answering your post. As you can see, Star Strider and Sean are exhausting themselves moving your remarks to Comment boxes, where they belong.

Sign in to comment.

Accepted Answer

Bjorn Gustavsson
Bjorn Gustavsson on 9 Feb 2015
1, start rewriting your function A without calls to the fft-family functions - simply replace them with multiplications with the Fourier matrix and its inverse (transpose..., look at dftmtx), that should make it a fair bit clearer how linear your problem is, I'm a bit concerned about the .* in the first and 2nd last line of the A function. outsize of that it seems pretty linear, and those seems to be just different weighting/filter factors?
If that works out and you end up with a linear problem it might end up a "rather big one". But try that anyway...

More Answers (1)

Matt J
Matt J on 9 Feb 2015
Edited: Matt J on 9 Feb 2015
Do you really need the normalization by max(Us(:)) in
y = Us./max(Us(:));
I assume it's because you normalize the measured 'y' data in a similar way. If you stop normalizing, it looks like your model becomes linear and you could solve it just using a series of filtering steps.
If you include the normalization, the model equation becomes non-differentiable, which creates issues for lsqcurvefit, and other solvers.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!