License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / src / c / operations / matrix_transpose.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2008-2008 - INRIA - Antoine ELIAS <antoine.elias@scilab.org>
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #include "matrix_transpose.h"
17
18 /*
19 +---+---+
20 | 1 | 2 |       +---+---+---+
21 +---+---+       | 6 | 4 | 2 |
22 | 3 | 4 |   ->  +---+---+---+
23 +---+---+       | 5 | 3 | 1 |
24 | 5 | 6 |       +---+---+---+
25 +---+---+
26 */
27 void vPretransposeRealMatrix(double *_pdblRealIn, int _iRowsIn, int _iColsIn, double *_pdblRealOut)
28 {
29     int iIndex = 0;
30     for (iIndex = 0 ; iIndex < _iRowsIn * _iColsIn ; iIndex++)
31     {
32         int Xa          = iIndex % _iRowsIn;
33         int Ya          = iIndex / _iRowsIn;
34         int Xb          = _iRowsIn - Xa - 1;
35         int Yb          = _iColsIn - Ya - 1;
36         int iNewCoord   = Xb * _iColsIn + Yb;
37
38         _pdblRealOut[iNewCoord] = _pdblRealIn[iIndex];
39     }
40 }
41
42 void vPretransposeComplexMatrix(double *_pdblRealIn, double *_pdblImgIn, int _iRowsIn, int _iColsIn, double *_pdblRealOut, double *_pdblImgOut)
43 {
44     int iIndex = 0;
45     for (iIndex = 0 ; iIndex < _iRowsIn * _iColsIn ; iIndex++)
46     {
47         int Xa          = iIndex % _iRowsIn;
48         int Ya          = iIndex / _iRowsIn;
49         int Xb          = _iRowsIn - Xa - 1;
50         int Yb          = _iColsIn - Ya - 1;
51         int iNewCoord   = Xb * _iColsIn + Yb;
52
53         _pdblRealOut[iNewCoord] = _pdblRealIn[iIndex];
54         _pdblImgOut[iNewCoord]  = -_pdblImgIn[iIndex];
55     }
56 }
57
58 void vTransposeRealMatrix(double *_pdblRealIn, int _iRowsIn, int _iColsIn, double *_pdblRealOut)
59 {
60     int iIndex = 0;
61     for (iIndex = 0 ; iIndex < _iRowsIn * _iColsIn ; iIndex++)
62     {
63         /*  int iNewCoord = iIndex % _iColsIn * _iRowsIn + (iIndex / _iColsIn);
64             _pdblRealOut[iIndex] = _pdblRealIn[iNewCoord];
65         */
66         int iNewCoord = iIndex % _iRowsIn * _iColsIn + (iIndex / _iRowsIn);
67         _pdblRealOut[iNewCoord] = _pdblRealIn[iIndex];
68     }
69 }
70
71 void vTransposeComplexMatrix(double *_pdblRealIn, double *_pdblImgIn, int _iRowsIn, int _iColsIn, double *_pdblRealOut, double *_pdblImgOut, int _iConjugate)
72 {
73     int iIndex = 0;
74     for (iIndex = 0 ; iIndex < _iRowsIn * _iColsIn ; iIndex++)
75     {
76         int iNewCoord = iIndex % _iRowsIn * _iColsIn + (iIndex / _iRowsIn);
77
78         _pdblRealOut[iNewCoord] = _pdblRealIn[iIndex];
79         if (_iConjugate == 0)
80         {
81             _pdblImgOut[iNewCoord] = _pdblImgIn[iIndex];
82         }
83         else
84         {
85             //Conjugate
86             _pdblImgOut[iNewCoord] = -_pdblImgIn[iIndex];
87         }
88     }
89 }
90
91 void vTransposeDoubleComplexMatrix(doublecomplex *_poIn, int _iRowsIn, int _iColsIn, doublecomplex *_poOut, int _iConjugate)
92 {
93     int iIndex = 0;
94     for (iIndex = 0 ; iIndex < _iRowsIn * _iColsIn ; iIndex++)
95     {
96         //int iNewCoord = iIndex % _iColsIn * _iRowsIn + (iIndex / _iColsIn);
97         int iNewCoord = iIndex % _iRowsIn * _iColsIn + (iIndex / _iRowsIn);
98         _poOut[iNewCoord].r = _poIn[iIndex].r;
99         if (_iConjugate == 0)
100         {
101             _poOut[iNewCoord].i = _poIn[iIndex].i;
102         }
103         else
104         {
105             //Conjugate
106             _poOut[iNewCoord].i = -_poIn[iIndex].i;
107         }
108     }
109 }