1
$\begingroup$

This problem arose in my stereo vision project.

I have two matrices: $$ A = \left( \begin{array}{ccc} \text{x1}*\text{p131}-\text{p111} & \text{x1}*\text{p132}-\text{p112} & \text{x1}*\text{p133}-\text{p113} \\ \text{y1}*\text{p131}-\text{p121} & \text{y1}*\text{p132}-\text{p122} & \text{y1}*\text{p133}-\text{p123} \\ \text{x2}*\text{p231}-\text{p211} & \text{x2}*\text{p232}-\text{p212} & \text{x2}*\text{p233}-\text{p212} \\ \text{y2}*\text{p231}-\text{p221} & \text{y2}*\text{p232}-\text{p222} & \text{y2}*\text{p233}-\text{p223} \end{array} \right) $$ $$B = \left( \begin{array}{c} \text{p114}-\text{x1}*\text{p134} \\ \text{p124}-\text{y1}*\text{p134} \\ \text{p214}-\text{x2}*\text{p234} \\ \text{p224}-\text{y2}*\text{p234} \end{array} \right) $$

I computed the following vector k:

k = Simplify[Inverse[Transpose[A].A].Transpose[A].B]

And mathematica output a huge answer for k (as expected), wich I think it's not necessary for me to type it in here.

Here is where my problem starts. This computation must be done at 120 Hz, where all entries of A and B are known, but only $\text{x1,x2,y1}$ and $\text{y2}$ change from time to time (forcing me to recompute the whole transpose and inverse thing every time they change).

I would like to express the matrix k as $$k = k1*k2 $$ where $k1$ entries are functions only of the $\text{p}_{ijk}$ and $k2$ entries are functions only of $\text{x1,x2,y1}$ and $\text{y2}$.

I suppose mathematica won't directly do that, but maybe I could use it to help me in the process.

To illustrate better what I mean for $k=k1*k2$ let me do an example:

Suppose I have the following vector $k$ $$k=\left( \begin{array}{c} \frac{b+a}{a} \\ a-b \\ 1+a.b \\ \frac{a}{b} \end{array} \right)$$

I could rewrite it as $$ k=\left( \begin{array}{c} 1+\frac{b}{a} \\ a-b \\ 1+a.b \\ \frac{a}{b} \end{array} \right) $$

and then as a matrix multiplication:

$$ k=\left( \begin{array}{c} 0 & 0 & 0 & 0 & 1 & 1\\ 1 & -1 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 1\\ 0 & 0 & 0 & 1 & 0 & 0 \end{array} \right)*\left( \begin{array}{c} a\\ b\\ a.b\\ \frac{a}{b} \\ \frac{b}{a} \\ 1 \end{array} \right) $$

Where only the second factor depends on $a$ and $b$

Hope I made myself clear. Any help would be appreciated!

$\endgroup$
5
  • 4
    $\begingroup$ This cannot be done in general. You have presented the normal equations for a least squares fit. To see what's possible, then, consider the simplest possible case where both $A$ and $B$ are $1$ by $1$ matrices of the form $A = xp-q$ and $B = xp'-q'$. Then $k = \frac{xp'-q'}{xp-q}$ obviously cannot be factored in the way you suppose. Therefore it is too much to hope that such a factorization would apply in more complicated situations. You would be better off using standard methods of ordinary least squares fitting compared to this brute-force method. $\endgroup$
    – whuber
    Feb 4, 2013 at 14:43
  • 2
    $\begingroup$ A numerical method will be vastly faster than trying precomputing a solution and if the matrix is well conditioned you should get stable results even with simple algorithms like gaussian elimination for computing the inverse numerically. If you are planning on using Mathematica for solving the problem numerically, have a look at the functions PseudoInverse, LeastSquares and LinearSolve. $\endgroup$ Feb 4, 2013 at 15:32
  • 2
    $\begingroup$ Keep in mind that you shouldn't invert a matrix when you are trying to solve a system of linear equations. Just use LinearSolve. See: johndcook.com/blog/2010/01/19/dont-invert-that-matrix $\endgroup$
    – Volker
    Feb 4, 2013 at 16:08
  • $\begingroup$ Thies Heidecke - Why would a numerical method be faster than precomputing the solution? $\endgroup$
    – JLagana
    Feb 6, 2013 at 1:07
  • $\begingroup$ whuber - You are indeed right that this does not hold in general, and only in special cases it would be possible. But I believe I'm dealing with one of those cases, since my answer was in terms of Pijk's and $x_i^n$'s, without any divisions. $\endgroup$
    – JLagana
    Feb 6, 2013 at 1:08

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.