If you don't like his answer, let me know. I have source code that I wrote several years ago in pascal for a linear algebra class - it should be easy to convert to C
Main Topics
Browse All Topics
Anyone knows how to do a 6x6 matrix inversion?
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
Ok, here are the various functions needed - there is some good news and some bad news - these functions will invert any matrix that is square (a general requirement for inversion) - one of the sub programs used to invert by the adjoint method - to get the determinant - is only capable of going to a 4x4 matrix - this program was written some 6+ years ago and the teacher only require max 4x4 matrices, although all of the other functions I had in the program would do up to a 20x20 matrix - my guess is because I was playing around with recursion then (something I always hated) and 5x5 + size matrices put too much on the stack for the compiler I was using at the time. - none the less, the formula used to calculate the inverse of the matrix does work - it just depends on you providing it with accurate information.
Oh - and the inverse function - (not inverse2 which is the adjoint method) does not require the det. although matrices should be tested with determinents to make sure that the det != 0.
There are 2 forms here, one is the adjoint method, the other is Gaussian - although I can't guarantee the gaussian function, it was originally written in fortran, and I converted it to pascal and there were still some errors; I don't remember what they are any more.
M, which is a common variable type is:
M = record
row,col:integer;
Matrix:array[1..max,1..max
end;
Procedure inverse2(tmp:M; var Inv:M);
{This calculates the inverse of a matrix by the classical adjoint method.
it does this by: 1/det(A) * adjoint(A) This prcedure just calls to get
the determinant and the adjoint then multiplies them.}
var
d:real;
begin
D:=det(tmp);
D:=1.0/D;
adjoint(tmp,inv);
multiply(1,D,inv,inv,inv);
end;
Procedure Inverse(tmp:M; Var Inv:M);
{This is the inverse method taken from the book. It has been converted
from FORTRAN. The book said it is a gaussian elimination method, so
that is what I call it. There are some bugs in the code that I haven't
been able to fix, but for the most part it works.}
var
tmp2,ans:M;
k,j,i:integer;
eq:boolean;
Begin
tmp2:=tmp;
eq:=false;
for k:=1 to tmp2.row do
begin
j:=1;
while (j<=tmp2.col) do
begin
If (j<>k) and (tmp2.matrix[k,j]<>0) then
tmp2.Matrix[k,j]:=tmp2.Mat
j:=j+1;
end;
tmp2.Matrix[k,k]:=1.0/tmp2
for i:=1 to tmp2.col do
begin
if i<>k then
begin
j:=1;
for j:=1 to tmp2.col do
begin
if j<>k then
tmp2.Matrix[I,J]:=tmp2.Mat
end;
end;
end;
for i:=1 to tmp2.col do
begin
if i<>k then
tmp2.Matrix[i,k]:=-tmp2.Ma
end;
end; {equiv to continue 6}
inv:=tmp2;
End;
Determinant function, and support function - this function is limited to a 4x4 matrix - I'm sure you probably already have a better det. function, as this was written 6+ years ago, and the instructor only required me to make the det function work with a 4x4 or smaller matrix:
Procedure eliminate(a:m; row,col,size:integer; var b:m);
{This procedure computes the minor of a matrix, row and column to be
is passed to the procedure in row,col. Size is really an unneeded
variable, it is just the size of A, the matrix passed to this procedure
must be square. The matrix is passed in A and the minor is returned
via B.}
var
i,j:integer;
Begin
clearmat(b);
for i:=1 to size-1 do
for j:=1 to size-1 do
if (i<row) and (j<col) then
b.matrix[i,j]:=a.matrix[i,
else
if (i<row) then
b.matrix[i,j]:=a.matrix[i,
else
if (j<col) then
b.matrix[i,j]:=a.matrix[i+
else
b.matrix[i,j]:=a.matrix[i+
b.row:=a.row-1;
b.col:=a.col-1;
end;
function det(a:m):real;
{This function returns a real number. It calculates the determinant of
Matrix A by using recursion. If the matrix is a 1x1 or a 2x2, the program
automaticaly calculates the determinant, otherwise, it will reduce larger
matrices into 2x2 matricies so that the determinant can be calculated.}
var
x,i:integer;
b:m;
t:real;
begin
if a.row=2 then
det:=a.matrix[1,1]*a.matri
else
if a.row=1 then
det:=a.matrix[1,1]
else
begin
t:=0.0;
for x:=1 to a.row do
begin
if (x mod 2)=0 then
i:=-1
else
i:=1;
eliminate(a,1,x,a.row,b); {minor}
t:=t+(i*a.matrix[1,x]*(det
det:=t;
end;
end;
end;
Good luck!
The inversion functions will invert matrices of ANY size -so I sent them to you. I sent the determinant function more as a courtesy as you didn't ask for that, you just asked for inversion - and procedure Inverse does not use the determinant in doing the inversion, so you should be able to use that. The fortran function I converted was the Inverse function (not inverse2 and det and eliminate) - and I don't own the fortran book that I had used as reference. At the time, I was in school and borrowed the fortran book from a teacher so I could do the conversion.
Frankly, the fortran function looks almost identical to my converted function - it is not *limited* to a 6x6. All you need to do is:
1) Create a struct following the record pattern I showed at the top.
2) Declare 2 variables to be of that record structure
3) Fill in one of the two variables you declared with a 6x6 matrix.
4) Convert the pascal Inverse Function (or the pascal Inverse2, and use the det and elimination functions as starter points in creating your own determination and elimination functions) - assuming you just did the Inverse function, it might look like:
void Inverse(struct MATRIX M, struct MATRIX *Result)
5) Call the inverse function with your input matrix, and the second declared matrix for the result - something like:
Inverse(InMat, &OutMat)
And that's it. I just said my det/elim functions wouldn't handle a 6x6.
Business Accounts
Answer for Membership
by: SlartiPosted on 1997-09-08 at 10:19:53ID: 1254294
eeeyliao, simtelnet/ msdos/cplu spls/ drmat rix.zip
Try using the following software package, which will do it for you:
http://www.simtel.net/pub/
The package allows you to perform various matrix operations, including multiplication, inversion, etc.