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
xposeg

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

Procedure

     XPOSEG ( Transpose a matrix, general )

     SUBROUTINE XPOSEG ( MATRIX, NROW, NCOL, XPOSEM )

Abstract

     Transpose a matrix of arbitrary size (the matrix
     need not be square).

Required_Reading

     None.

Keywords

     MATRIX

Declarations

     IMPLICIT NONE

     DOUBLE PRECISION   MATRIX ( 0:* )
     INTEGER            NROW
     INTEGER            NCOL
     DOUBLE PRECISION   XPOSEM ( 0:* )

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     MATRIX     I   Matrix to be transposed.
     NROW       I   Number of rows of input matrix MATRIX.
     NCOL       I   Number of columns of input matrix MATRIX.
     XPOSEM     O   Transposed matrix.

Detailed_Input

     MATRIX   is a matrix to be transposed.

     NROW     is the number of rows of input matrix MATRIX.

     NCOL     is the number of columns of input matrix MATRIX.

Detailed_Output

     XPOSEM   is the transposed matrix.

Parameters

     None.

Exceptions

     Error free.

     1)  If either NROW or NCOL is less than or equal to zero, no
         action is taken. The routine simply returns.

Files

     None.

Particulars

     This routine transposes the input matrix MATRIX and writes the
     result to the matrix XPOSEM. This algorithm is performed in
     such a way that the transpose can be performed in place. That
     is, MATRIX and XPOSEM can use the same storage area in memory.

     NOTE:  The matrices MATRIX and XPOSEM are declared
            one-dimensional for computational purposes only. The
            calling program should declare them as MATRIX(NROW,NCOL)
            and XPOSEM(NCOL,NROW).

            This routine works on the assumption that the input and
            output matrices are defined as described above. More
            specifically it assures that the elements of the matrix
            to be transformed are stored in contiguous memory locations
            as shown here. On output these elements will be
            rearranged in consecutive memory locations as shown.

               MATRIX              XPOSEM

                m_11                m_11
                m_21                m_12
                m_31                m_13
                 .                   .
                 .                   .
                 .                  m_1ncol
                m_nrow1             m_21
                m_12                m_22
                m_22                m_23
                m_32                 .
                 .                   .
                 .                  m_2ncol
                 .                   .
                m_nrow2
                 .                   .

                 .                   .

                 .                   .
                m_1ncol
                m_2ncol             m_nrow1
                m_3ncol             m_nrow2
                 .                  m_nrow3
                 .                   .
                 .                   .
                m_nrowncol          m_nrowncol


     For those familiar with permutations, this algorithm relies
     upon the fact that the transposition of a matrix, which has
     been stored as a string, is simply the action of a
     permutation applied to that string. Since any permutation
     can be decomposed as a product of disjoint cycles, it is
     possible to transpose the matrix with only one additional
     storage register. However, once a cycle has been computed
     it is necessary to find the next entry in the string that
     has not been moved by the permutation. For this reason the
     algorithm is slower than would be necessary if the numbers
     of rows and columns were known in advance.

Examples

     This routine is primarily useful when attempting to transpose
     large matrices, where inplace transposition is important. For
     example suppose you have the following declarations

         DOUBLE PRECISION      MATRIX ( 1003, 800  )

     If the transpose of the matrix is needed, it may not be
     possible to fit a second matrix requiring the same storage
     into memory. Instead declare XPOSEM as below and use
     an equivalence so that the same area of memory is allocated.

         DOUBLE PRECISION      XPOSEM (  800, 1003 )
         EQUIVALENCE         ( MATRIX (1,1), XPOSEM(1,1) )

     To obtain the transpose simply execute

         CALL XPOSEG ( MATRIX, 1003, 800, XPOSEM )

Restrictions

     None.

Literature_References

     None.

Author_and_Institution

     N.J. Bachman       (JPL)
     J. Diaz del Rio    (ODC Space)
     H.A. Neilan        (JPL)
     W.L. Taber         (JPL)

Version

    SPICELIB Version 1.3.0, 13-AUG-2021 (JDR)

        Edited the header to comply with NAIF standard. Removed
        unnecessary $Revisions section.

    SPICELIB Version 1.2.3, 22-APR-2010 (NJB)

        Header correction: assertions that the output
        can overwrite the input have been removed.

    SPICELIB Version 1.2.2, 04-MAY-1993 (HAN)

        The example listed arguments in the call to XPOSEG incorrectly.
        The number of rows was listed as the number of columns, and
        the number of columns was listed as the number of rows.

    SPICELIB Version 1.2.1, 10-MAR-1992 (WLT)

        Comment section for permuted index source lines was added
        following the header.

    SPICELIB Version 1.2.0, 06-AUG-1990 (WLT)

        The original version of the routine had a bug. It worked
        in place, but the fixed points (1,1) and (n,m) were not
        moved so that the routine did not work if input and output
        matrices were different.

    SPICELIB Version 1.0.0, 31-JAN-1990 (WLT) (NJB)
Fri Dec 31 18:37:09 2021