Solved

Matrix inversion [6x6]

Posted on 1997-09-08
10
8,443 Views
Last Modified: 2012-06-21

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

Expert Comment

by:Slarti
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

by:navigator010897
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

by:eeeyliao
ID: 1254296
I know some packages such as Matlab etc, but i need the algorithm
and the source code.
Can I have your source code in Pascal pleases?
0
 
LVL 2

Expert Comment

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

Expert Comment

by:alexxx
ID: 1254298
Adjust your points to 200 and I'll send you the source in Pascal.
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
LVL 1

Accepted Solution

by:
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;
  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.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

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

Can you send me your programs in Fortran please?
0
 
LVL 1

Expert Comment

by:navigator010897
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

by:eeeyliao
ID: 1254302
Thank you for your help!
0
 

Author Comment

by:eeeyliao
ID: 1254303
Thank you for your help!
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

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.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now