Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

Anyone knows how to do a 6x6 matrix inversion?

Experts Exchange Solution brought to you by

Enjoy your complimentary solution view.

Get every solution instantly with premium.
Start your 7-day free trial.

I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

and the source code.

Can I have your source code in Pascal pleases?

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!

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trialFrankly, 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.

C

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Experts Exchange Solution brought to you by

Enjoy your complimentary solution view.

Get every solution instantly with premium.
Start your 7-day free trial.

Try using the following software package, which will do it for you:

http://www.simtel.net/pub/simtelnet/msdos/cpluspls/drmatrix.zip

The package allows you to perform various matrix operations, including multiplication, inversion, etc.