comp.lang.ada
 help / color / mirror / Atom feed
From: ma740988@pegasus.cc.ucf.edu (Mark)
Subject: Re: C to Ada conversion
Date: 16 Jan 2003 13:17:22 -0800
Date: 2003-01-16T21:17:22+00:00	[thread overview]
Message-ID: <a5ae824.0301161317.3e084a77@posting.google.com> (raw)
In-Reply-To: rH%U9.74545$3v.13364@sccrnsc01

Gents, Could someone point me in the right direction on converting a
few other routines.  Similar to that done by tmorgan.  Dont think i
did things right.  These are much simpler.

Here's my definitons

  Ns : constant Integer := 30;
  Ms : constant Integer := 12;
  Rs : constant Integer := 6;

  type Matrices is array (Integer range <>, Integer range <>) of
Float;

  -- A is an n by n matrix, A is the state transistion matrix
  -- B is an n by m matrix, B is the input matrix
  -- C is an r by n matrix, C is the measurement matrix
  -- xhat is an n by 1 vector, xhat is the current state of the system
  -- y is an r by 1 vector, y is the measured output of the system
  -- u is an m by 1 vector, u is the known input to the system
  -- Sz is an r by r matrix, Sz is the measurement nise covariance
  -- Sw is an n by n matrix, Sw is the process noise covariance
  -- P is an n by n matrix, P is the estimator error covariance

  A         : Matrices(1 .. Ns, 1 .. Ns);
  B         : Matrices(1 .. Ns, 1 .. Ms);
  C         : Matrices(1 .. Ns, 1 .. Rs);
  xhat      : Matrices(1 .. Ns, 1 .. 1);
  Y         : Matrices(1 .. Rs, 1 .. 1);
  U         : Matrices(1 .. Ms, 1 .. 1);
  Sz        : Matrices(1 .. Rs, 1 .. Rs);
  Sw        : Matrices(1 .. Ns, 1 .. Ns);
  P         : Matrices(1 .. Ns, 1 .. Ns);
  AP        : Matrices(1 .. Ns, 1 .. Ns);  -- This is the matrix A*P
  CT        : Matrices(1 .. Ns, 1 .. Rs);  -- This is the matrix CT
  APCT      : Matrices(1 .. Ns, 1 .. Rs);  -- This is the matrix
A*P*CT
  CP        : Matrices(1 .. Rs, 1 .. Ns);  -- This is the matrix C*P
  CPCT      : Matrices(1 .. Rs, 1 .. Rs);  -- This is the matrix
C*P*CT
  CPCTSz    : Matrices(1 .. Rs, 1 .. Rs);  -- This is the matrix
C*P*CT+Sz
  CPCTSzInv : Matrices(1 .. Rs, 1 .. Rs);  -- (C*P*CT+Sz)**-1
  K         : Matrices(1 .. Ns, 1 .. Rs);  -- This is the Kalman gain.
  Cxhat     : Matrices(1 .. Rs, 1 .. 1);   -- This is the vector
C*xhat
  yCxhat    : Matrices(1 .. Rs, 1 .. 1);   -- This is the vector
y-C*xhat
  KyCxhat   : Matrices(1 .. Ns, 1 .. 1);   -- This is the vector
K*(y-C*xhat)
  Axhat     : Matrices(1 .. Ns, 1 .. 1);   -- This is the vector
A*xhat
  Bu        : Matrices(1 .. Ns, 1 .. 1);   -- This is the vector B*u
  AxhatBu   : Matrices(1 .. Ns, 1 .. 1);   -- This is the vector
A*xhat+B*u
  AT        : Matrices(1 .. Ns, 1 .. Ns);  -- This is the matrix AT
  APAT      : Matrices(1 .. Ns, 1 .. Ns);  -- This is the matrix
A*P*AT
  APATSw    : Matrices(1 .. Ns, 1 .. Ns);  -- This is the matrix
A*P*AT+Sw
  CPAT      : Matrices(1 .. Rs, 1 .. Ns);  -- This is the matrix
C*P*AT
  SzInv     : Matrices(1 .. Rs, 1 .. Rs);  -- This is the matrix Sz-1
  APCTSzInv : Matrices(1 .. Ns, 1 .. Rs);  -- This is the matrix
A*P*CT*Sz-1
  APCTSzInvCPAT  : Matrices(1 .. Ns, 1 .. Ns);   -- This is the matrix
A*P*CT*Sz-1*C*P*AT


Thanks in advance. 


void MatrixMultiply(float* A, float* B, int m, int p, int n, float* C)
{       

  /* 
  A = input matrix (m x p)
  B = input matrix (p x n)
  m = number of rows in A
  p = number of columns in A = number of columns in B       
  n = number of columns in B
  C = output matrix = A*B (m x n)
  */ 
  int i, j, k;
  for (i=0;i<m;i++)
    for(j=0;j<n;j++)
	{
	  C[n*i+j]=0;
	  for (k=0;k<p;k++)
	    C[n*i+j]= C[n*i+j]+A[p*i+k]*B[n*k+j];
	}
}

-- following tmorgans convesion
procedure MatrixMultiply(A: in out Matrices;
                         
begin

end MatrixMultiply;

-----
void MatrixAddition(float* A, float* B, int m, int n, float* C)
{
  /* 
  A = input matrix (m x n)
  B = input matrix (m x n)
  m = number of rows in A = number of rows in B
  n = number of columns in A = number of columns in B
  C = output matrix = A+B (m x n)  
  */ 
  int i, j;
  for (i=0;i<m;i++)
    for(j=0;j<n;j++)
	  C[n*i+j]=A[n*i+j]+B[n*i+j];
}
void MatrixSubtraction(float* A, float* B, int m, int n, float* C)
{
  /* 
  A = input matrix (m x n)
  B = input matrix (m x n)
  m = number of rows in A = number of rows in B
  n = number of columns in A = number of columns in B
  C = output matrix = A-B (m x n)  
  */
  int i, j;
  for (i=0;i<m;i++)
    for(j=0;j<n;j++)
	  C[n*i+j]=A[n*i+j]-B[n*i+j];
}                    

void MatrixTranspose(float* A, int m, int n, float* C)
{    

     /* 
     A = input matrix (m x n)
     m = number of rows in A 
     n = number of columns in A 
     C = output matrix = the transpose of A (n x m)
     */
  int i, j;
  for (i=0;i<m;i++)
    for(j=0;j<n;j++)
      C[m*j+i]=A[n*i+j];     
      
}


tmoran@acm.org wrote in message news:<rH%U9.74545$3v.13364@sccrnsc01>...
> > >   Rs : constant := 6;
> > >   type Matrices is array (1 .. Rs, 1 .. Rs) of Float;
> > Do you think that's fair ?-) The original profile of the C routine was
> >
> > int MatrixInversion(float* A, int n, float* AInverse)
>   Oops.  I saw the #define on rs before the array declarations and thought
> "Aha, known at compile time", but of course you are right that the
> Matrix_Inversion routine doesn't depend on rs and will take any size
> array.  So I withdraw my suggestion.
> 
> > This is NOT pointless because a piece of code should also
> > work correctly if someone turns off the automatic checks in Ada.
>   I disagree.  Turning off checks is a substantial change to the
> assumptions of the programmer.  If he coded to not depend on the
> assumption that checks are on, great.  But I don't think one should
> assume the programmer didn't assume checks unless he says so.  If
> the code should be able to run with checks off, there's no reason
> to ever have them on, and the source code should include the
> pragma to turn them off.
> 
>   Converting index ranges like this by passing to a subroutine is
> very nice.  I hadn't seen that done before.



  reply	other threads:[~2003-01-16 21:17 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-13 21:22 C to Ada conversion Mark
2003-01-13 23:14 ` tmoran
2003-01-14  1:27   ` Jeffrey Carter
2003-01-14  3:16     ` tmoran
2003-01-14 12:52       ` Mark
2003-01-14 19:35     ` John R. Strohm
2003-01-14  7:20   ` Martin Dowie
2003-01-14  8:49     ` tmoran
2003-01-14 22:45       ` Martin Dowie
2003-01-14 13:01     ` Mark
2003-01-14 17:18   ` Dr. Michael Paus
2003-01-14 18:10     ` tmoran
2003-01-14 18:24       ` tmoran
2003-01-14 19:48         ` Dr. Michael Paus
2003-01-14 20:12           ` Vinzent Hoefler
2003-01-14 21:55           ` tmoran
2003-01-16 21:17             ` Mark [this message]
2003-01-17  0:10               ` tmoran
2003-01-17  1:09               ` John R. Strohm
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox