I am looking for some (long) time now for an interative SVD algorithm. Goal is to use this for incoming datastream (1 update at time) and perform some sliding signal processing to extract information content by dynamic mode decomposition.
The Idea/Question is:
A is a rectangular matrix m>n build on a measurement stream evolving over time
SVD decomposition of A is known at a given timestamp: [U0,S0,V0]=SVD(A0)
We take the next measurement data to create A1
- 1 line is removed on the top of A0
- 1 new line is added to A0 on the bottom
- Rank of A0 and A1 are supposed identical
- Size of A0 and A1 are the same
- A1 is verry near to A0
Singular values are close and change slowly
Basis operator U0 and V0 are close and changes slowly
Is there a way to verry rapidely calculate SVD(A1) ?
something like [U1,S1,V1] = SVD(A1,U0,S0,V0);
a kind of iterative or perturbation method...
Remark: an iterative eigendecomposition could also do the job
type of: [V1,D1] = eig(A1,V0,D0)
V,D beeing resp. the EgenVectors and EigenValues
From this point a raisonable calculation of U,S,V is also possible
Does someone has a good clue how to do this?
Moreover, if some lin algebra specialist could implement this in std tools (blas, mkl, octave, python...) it would be terrific.
Thanks a lot for every info.