[eigen] request for help: 4x4 matrix inverse

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]

Hi List,

I have started coding the LU module and committed already this:
- optimized determinants for sizes <=4
  (Thanks to Geoff for pointing me to the 30-mul technique for size 4).
- general matrix inversion (good for sizes >= 5)
- bruteforce matrix inversion using cofactors for sizes <=3
- unrolled version of the general method for size 4

Since the latter unrolled version is clumsy and is only used for size 4, since 
after all it seems that a bruteforce (cofactor) technique would be faster, 
and since size 4 is a common case that we want to optimize, I am asking:

do you have good 4x4 matrix inversion code that you could contribute? Or can 
you point me to a good "algorithm" ? I put quotation marks because we know 
the algorithm is just brutefore, the question is how to implement it to 
minimize the number of ops and perhaps to take advantage of vectorization...

Markos: if I remember correctly, you mentioned you had AltiVec code for that. 
When you mentioned it I was still hoping that the unrolled gaussian 
elimination would be good but now I realize that it's not, so I'm very much 
interested in your code if you want to contribute it :) Extra points if it 
also works with SSE.

I am also -- and most importantly -- looking for an optimized non-vectorized 

As you'll see in src/LU/Inverse.h, we have a template parameter bool 
CheckExistence. If true, we must carefully check that the inverse exists. 
Ideally, your implementation would do that in an optimized way when 
CheckExistence==true, and we would not pay any cost when 

The API is:

Matrix4d m;
m.inverse(); // CheckExistence==true
m.quickInverse(); // CheckExistence==false

Inverse<Matrix4d> inverse_of_m(m);
  // or, if you prefer, Inverse<Matrix4d> inverse_of_m = m.inverse();
	cout << inverse_of_m << endl;



Attachment: signature.asc
Description: This is a digitally signed message part.

Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/