Solved

# Matrix inversion [6x6]

Posted on 1997-09-08
8,443 Views

Anyone knows how to do a 6x6 matrix inversion?
0
Question by:eeeyliao
• 4
• 3
• 2
• +1

LVL 2

Expert Comment

ID: 1254294
eeeyliao,
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.

0

LVL 1

Expert Comment

ID: 1254295
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
0

Author Comment

ID: 1254296
I know some packages such as Matlab etc, but i need the algorithm
and the source code.
0

LVL 2

Expert Comment

ID: 1254297
Adjust your points to 200 and I'll send you the source in Pascal.
0

LVL 2

Expert Comment

ID: 1254298
Adjust your points to 200 and I'll send you the source in Pascal.
0

LVL 1

Accepted Solution

navigator010897 earned 20 total points
ID: 1254299
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] of real;
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;
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.Matrix[k,j]/tmp2.Matrix[k,k];
j:=j+1;
end;

tmp2.Matrix[k,k]:=1.0/tmp2.Matrix[k,k];

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.Matrix[I,J]-tmp2.Matrix[k,j]*tmp2.Matrix[i,k];
end;
end;
end;

for i:=1 to tmp2.col do
begin
if i<>k then
tmp2.Matrix[i,k]:=-tmp2.Matrix[i,k]*tmp2.Matrix[k,k];
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,j]
else
if (i<row) then
b.matrix[i,j]:=a.matrix[i,j+1]
else
if (j<col) then
b.matrix[i,j]:=a.matrix[i+1,j]
else
b.matrix[i,j]:=a.matrix[i+1,j+1];
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.matrix[2,2]-a.matrix[1,2]*a.matrix[2,1]
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(b)));
det:=t;
end;
end;
end;

Good luck!
0

Author Comment

ID: 1254300
I need to inverse a 6x6 matrix!

0

LVL 1

Expert Comment

ID: 1254301
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.
0

Author Comment

ID: 1254302
0

Author Comment

ID: 1254303
0

## Featured Post

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.