linear_algebra plugged.
[scilab.git] / scilab / modules / linear_algebra / includes / eigen.h
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bernard HUGUENEY 
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 #ifndef EIGEN_H
13 #define EIGEN_H
14
15 #include "doublecomplex.h"
16 #include "dynlib_linear_algebra.h"
17 /*
18  * Functions used to compute eigen values (and possibly eigen vectors) of one [complex|real] [un]symmetric matrix.
19  * We use 4 different functions because for e;fficiency reasons, API had to be different :
20  * 1) eigen vectors for symmetric matrix are computed in place in the same memory location as the argument matrix
21  * 2) complex eigen values for unsymmetric matrix are computed either in 'c' format (for real argument matrix) or 'z' format (complex argument matrix)
22  *
23  * @param pData double[complex]* in (& out for symmetric) argument matrix data, for symmetric, is also use to output eigen vectors
24  * @param iCols int nb of rows/cols of matrix
25  * @param computeEigenVectors int (boolean semantics) only need for symmetric : indicates weither eigenvectors should be computed
26  *
27  * out :
28  * eigen values either real or complex in 'z' format
29  * @param pEigenValues double[complex]* output eigen values
30  *
31  *  or complex in 'c' format
32  * @param pEigenValuesReal double* output eigen values real part
33  * @param pEigenValuesImg double* output eigen values imaginary part
34  *
35  * for unsymmetric cases, output complex eigen vectors either in 'z' format (complex argument)
36  * @param pEigenVectors doublecomplex* output eigen vectors
37  *
38  * or in 'c' format (real argument)
39  * @param pEigenVectorsReal double* output eigen vectors real part
40  * @param pEigenVectorsImg double* output eigen vectors imaginary part
41  *
42  */
43 LINEAR_ALGEBRA_IMPEXP int iEigen1ComplexSymmetricM(doublecomplex* pData, int iCols, int computeEigenVectors, double* pEigenValues);
44 LINEAR_ALGEBRA_IMPEXP int iEigen1RealSymmetricM(double* pData, int iCols, int computeEigenVectors, double* pEigenValues);
45
46 LINEAR_ALGEBRA_IMPEXP int iEigen1ComplexM(doublecomplex* pData, int iCols, doublecomplex* pEigenValues, doublecomplex* pEigenVectors);
47 LINEAR_ALGEBRA_IMPEXP int iEigen1RealM(double* pData, int iCols, double* pEigenValuesReal, double* pEigenValuesImg, double* pEigenVectorsReal, double* pEigenVectorsImg);
48
49 /*
50  * With 2 lhs, eigenvalues are expanded from a 1D vector to the diagonal of a matrix.
51  * The resulting matrix is a diagonal one: m[i,j]=0. for i!=j .
52  * For efficiency reasons, we also convert from 'z' to 'c' format at the same time. In this case, conversion cannont be done in place.
53  *
54  * /!\ For the real case, expansion is done in place, so obviously the memory must have been reserved accordingly /!\
55  * (i.e for the iCols x iCols matrix, not only the iCols x 1 vector.)
56  *
57  * @param pData double[complex]* : input  (&output for real) pData[0:iCols[ contains diagonal elements
58  * @param iCols int : input nb of elements
59  * 
60  * out:
61  * @param  pRMatrix double* real part of the diagonal output matrix
62  * @param  pIMatrix double* imaginary part of the diagonal output matrix
63  */
64 LINEAR_ALGEBRA_IMPEXP void expandToDiagonalOfMatrix(double* pData, int iCols);
65 LINEAR_ALGEBRA_IMPEXP void expandZToDiagonalOfCMatrix(doublecomplex const* pZVector, int iCols, double* pRMatrix, double* pIMatrix);
66
67
68
69 /*
70  * Functions used to compute eigen values (and possibly eigen vectors) of two [complex|real]  matrix.
71  *
72  * @param pData1 double[complex]* in argument1 matrix data
73  * @param pData2 double[complex]* in argument2 matrix data
74  *
75  * @param iCols int nb of rows/cols of matrix
76  *
77  * out : when something should not be computed (depending on lhs), output buffer ptr is NULL
78  *
79  * Alpha is either
80  * in 'z' format for complex matrix
81  * @param pAlpha doublecomplex*
82  *
83  * or 'c' format for real matrix
84  *
85  * @param pAlphaReal double*
86  * @param pAlphaImg double*
87  *
88  *
89  * @param pBeta double[complex]* 
90  *
91  * L and R are either
92  * in 'z' format for complex matrix
93  * @param pL doublecomplex*
94  * @param pR doublecomplex*
95  *
96  * or 'c' format for real matrix
97  *
98  * @param pLReal double*
99  * @param pLImg double*
100  * @param pRReal double*
101  * @param pRImg double*
102  *
103  */
104
105 LINEAR_ALGEBRA_IMPEXP int iEigen2ComplexM(doublecomplex* pData1, doublecomplex* pData2, int iCols
106                      , doublecomplex* pAlpha, doublecomplex* pBeta, doublecomplex* pR, doublecomplex* pL);
107 LINEAR_ALGEBRA_IMPEXP int iEigen2RealM(double* pData1, double* pData2, int iCols
108                      , double* pAlphaReal, double* pAlphaImg, double* pBeta, double* pRReal, double* pRimg, double* pLReal, double* pLImg);
109
110 #endif