Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
mxmtg_c

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version
Index_Entries

Procedure

   mxmtg_c ( Matrix times matrix transpose, general dimension ) 

   void mxmtg_c ( const void   * m1,
                  const void   * m2,
                  SpiceInt       nr1,
                  SpiceInt       nc1c2,
                  SpiceInt       nr2,
                  void         * mout  )

Abstract

   Multiply a matrix and the transpose of a matrix, both of
   arbitrary size.

Required_Reading

   None.

Keywords

   MATRIX


Brief_I/O

   VARIABLE  I/O  DESCRIPTION
   --------  ---  --------------------------------------------------
   m1         I   Left-hand matrix to be multiplied.
   m2         I   Right-hand matrix whose transpose is to be multiplied.
   nr1        I   Row dimension of `m1' and row dimension of `mout'.
   nc1c2      I   Column dimension of `m1' and column dimension of `m2'.
   nr2        I   Row dimension of `m2' and column dimension of `mout'.
   mout       O   Product matrix.

Detailed_Input

   m1          is a double precision matrix of arbitrary size.

   m2          is a double precision matrix of arbitrary size.
               The number of columns in `m2' must match the number of
               columns in `m1'.

   nr1         is the number of rows in both `m1' and `mout'.

   nc1c2       is the number of columns in `m1' and (by necessity) the
               number of columns of `m2'.

   nr2         is the number of rows in both `m2' and the number of
               columns in `mout'.

Detailed_Output

   mout        is the product matrix given by

                                    t
                  mout = (m1) x (m2)


               where the superscript `t' denotes the transpose matrix.
               This is a double precision matrix of dimension nr1 x nr2.

               `mout' may overwrite `m1' or `m2'.

Parameters

   None.

Exceptions

   1)  If memory cannot be allocated to create the temporary matrix
       required for the execution of the routine, the error
       SPICE(MALLOCFAILED) is signaled.

Files

   None.

Particulars

   The code reflects precisely the following mathematical expression:

   For each value of the subscript `i' from 1 to `nr1', and `j' from 1
   to `nr2':

      mout(i,j) = summation from k=1 to nc1c2 of  ( m1(i,k) * m2(j,k) )

   Notice that the order of the subscripts of `m2' are reversed from
   what they would be if this routine merely multiplied `m1' and `m2'.
   It is this transposition of subscripts that makes this routine
   multiply `m1' and the TRANPOSE of `m2'.

Examples

   The numerical results shown for this example may differ across
   platforms. The results depend on the SPICE kernels used as
   input, the compiler and supporting libraries, and the machine
   specific arithmetic implementation.

   1) Given a 2x3 and a 3x4 matrices, multiply the first matrix by
      the transpose of the second one.


      Example code begins here.


      /.
         Program mxmtg_ex1
      ./
      #include <stdio.h>
      #include "SpiceUsr.h"

      int main( )
      {

         /.
         Local variables.
         ./
         SpiceDouble          mout   [2][4];

         SpiceInt             i;

         /.
         Define `m1' and `m2'.
         ./
         SpiceDouble          m1     [2][3] = { {1.0,  2.0,  3.0},
                                                {3.0,  2.0,  1.0} };

         SpiceDouble          m2     [4][3] = { { 1.0,  2.0,  0.0},
                                                { 2.0,  1.0,  2.0},
                                                { 1.0,  2.0,  0.0},
                                                { 2.0,  1.0,  2.0} };

         /.
         Multiply `m1' by the transpose of `m2'.
         ./
         mxmtg_c ( m1, m2, 2, 3, 4, mout );

         printf( "M1 times transpose of M2:\n" );
         for ( i = 0; i < 2; i++ )
         {
            printf( "%10.3f %9.3f %9.3f %9.3f\n",
                    mout[i][0], mout[i][1], mout[i][2], mout[i][3] );
         }

         return ( 0 );
      }


      When this program was executed on a Mac/Intel/cc/64-bit
      platform, the output was:


      M1 times transpose of M2:
           5.000    10.000     5.000    10.000
           7.000    10.000     7.000    10.000

Restrictions

   1)  No error checking is performed to prevent numeric overflow or
       underflow.

       The user is responsible for checking the magnitudes of the
       elements of `m1' and `m2' so that a floating point overflow does
       not occur.

   2)  No error checking is performed to determine if the input and
       output matrices have, in fact, been correctly dimensioned.

Literature_References

   None.

Author_and_Institution

   N.J. Bachman        (JPL)
   J. Diaz del Rio     (ODC Space)
   W.M. Owen           (JPL)
   W.L. Taber          (JPL)

Version

   -CSPICE Version 1.3.0, 06-AUG-2021 (JDR)

       Changed the input argument names "nrow1" and "nrow2" to "nr1"
       and "nr2" for consistency with other routines.

       Updated short error message for consistency within CSPICE wrapper
       interface: MEMALLOCFAILED -> MALLOCFAILED.

       Edited the header to comply with NAIF standard.
       Added complete code example based on the existing example.

   -CSPICE Version 1.2.0, 28-AUG-2001 (NJB)

       Const-qualified input arrays.

   -CSPICE Version 1.1.0, 08-FEB-1998 (NJB)

       Corrected a comment describing the local macro INDEX. Made
       miscellaneous code format corrections.

   -CSPICE Version 1.0.0, 25-OCT-1997 (NJB) (WMO) (WLT)

       Based on SPICELIB Version 1.0.1, 10-MAR-1992 (WLT)

Index_Entries

   matrix times matrix_transpose n-dimensional_case
Fri Dec 31 18:41:09 2021