From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,LOTS_OF_MONEY autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,83d2d63f98e99c58 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-01-16 13:17:22 PST Path: archiver1.google.com!postnews1.google.com!not-for-mail From: ma740988@pegasus.cc.ucf.edu (Mark) Newsgroups: comp.lang.ada Subject: Re: C to Ada conversion Date: 16 Jan 2003 13:17:22 -0800 Organization: http://groups.google.com/ Message-ID: References: NNTP-Posting-Host: 192.91.147.35 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: posting.google.com 1042751842 5662 127.0.0.1 (16 Jan 2003 21:17:22 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: 16 Jan 2003 21:17:22 GMT Xref: archiver1.google.com comp.lang.ada:33105 Date: 2003-01-16T21:17:22+00:00 List-Id: 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... > > > 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.