From: "John R. Strohm" <strohm@airmail.net>
Subject: Re: C to Ada conversion
Date: Thu, 16 Jan 2003 19:09:10 -0600
Date: 2003-01-16T19:09:10-06:00 [thread overview]
Message-ID: <BBAD79A5BDEEEE5E.C9430A3823C58C0D.8569CE3A9FBE725E@lp.airnews.net> (raw)
In-Reply-To: a5ae824.0301161317.3e084a77@posting.google.com
Y'know, if you asked around politely, you could probably find a
completely-written Kalman filter in Ada somewhere. I'd try looking in the
Aerospace Engineering department: some of the professors probably know
people at the big defense companies.
"Mark" <ma740988@pegasus.cc.ucf.edu> wrote in message
news:a5ae824.0301161317.3e084a77@posting.google.com...
> 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.
prev parent reply other threads:[~2003-01-17 1:09 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
2003-01-17 0:10 ` tmoran
2003-01-17 1:09 ` John R. Strohm [this message]
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox