J'ai "roulé" l'implémentation de MESA (j'ai également écrit quelques tests unitaires pour m'assurer qu'elle fonctionne réellement).
Ici :
float invf(int i,int j,const float* m){
int o = 2+(j-i);
i += 4+o;
j += 4-o;
#define e(a,b) m[ ((j+b)%4)*4 + ((i+a)%4) ]
float inv =
+ e(+1,-1)*e(+0,+0)*e(-1,+1)
+ e(+1,+1)*e(+0,-1)*e(-1,+0)
+ e(-1,-1)*e(+1,+0)*e(+0,+1)
- e(-1,-1)*e(+0,+0)*e(+1,+1)
- e(-1,+1)*e(+0,-1)*e(+1,+0)
- e(+1,-1)*e(-1,+0)*e(+0,+1);
return (o%2)?inv : -inv;
#undef e
}
bool inverseMatrix4x4(const float *m, float *out)
{
float inv[16];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
inv[j*4+i] = invf(i,j,m);
double D = 0;
for(int k=0;k<4;k++) D += m[k] * inv[k*4];
if (D == 0) return false;
D = 1.0 / D;
for (int i = 0; i < 16; i++)
out[i] = inv[i] * D;
return true;
}
J'ai écrit un peu sur ce sujet et j'ai montré le schéma des facteurs positifs/négatifs. sur mon blog .
Comme l'a suggéré @LiraNuna, des versions accélérées par le matériel de ces routines sont disponibles sur de nombreuses plates-formes. Je suis donc heureux d'avoir une "version de secours" qui soit lisible et concise.
Note Il est possible que l'exécution soit 3,5 fois plus lente, voire pire, que l'implémentation MESA. Vous pouvez déplacer le modèle des facteurs pour supprimer certains ajouts, etc... mais cela perdrait en lisibilité et ne serait toujours pas très rapide.
3 votes
Est-ce un devoir à domicile ? Si ce n'est pas le cas (par exemple, vous essayez simplement de résoudre Ax=b), alors essayer de calculer explicitement un inverse n'est peut-être pas ce que vous voulez faire.
11 votes
Ce n'est pas un devoir. c'est pour un projet personnel. et je ne veux pas "perdre" du temps à apprendre l'inversion de matrice pour 4x4 qui semble assez compliqué par rapport à 3x3.
13 votes
Je ne pense pas qu'il s'agisse d'une question stupide qui mérite un score de -1.
4 votes
Si votre matrice est une matrice de rotation/mise à l'échelle/translation, elle est liée : stackoverflow.com/questions/155670/ & web.archive.org/web/20130806093214/http://…
0 votes
Vous pouvez également être intéressé par ceci si vous voulez un peu plus de performance. lxjk.github.io/2017/09/03/… et vous ne pouvez pas traiter plusieurs matrices à la fois