summaryrefslogtreecommitdiff
path: root/src/matrixOperations/logm/zlogma.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/matrixOperations/logm/zlogma.c')
-rw-r--r--src/matrixOperations/logm/zlogma.c69
1 files changed, 14 insertions, 55 deletions
diff --git a/src/matrixOperations/logm/zlogma.c b/src/matrixOperations/logm/zlogma.c
index 5a10151e..3a629bfd 100644
--- a/src/matrixOperations/logm/zlogma.c
+++ b/src/matrixOperations/logm/zlogma.c
@@ -20,6 +20,7 @@
#include "matrixInversion.h"
#include "max.h"
#include "conj.h"
+#include "spec.h"
void zlogma (doubleComplex* in, int rows, doubleComplex* out){
@@ -30,77 +31,37 @@ void zlogma (doubleComplex* in, int rows, doubleComplex* out){
* logm = Vp * diag(log(diag(vp)) * inv(Vp) */
- int i;
+ int i = 0,j = 0;
doubleComplex *eigenvalues, *eigenvectors, *tmp;
int hermitienne = 0;
- int info = 0; /* Used by LAPACK */
- int iWorkSize = 0; /* Used by LAPACK */
- doubleComplex *pdblWork = NULL; /* Used by LAPACK */
- doubleComplex *pdblRWork = NULL; /* Used by LAPACK */
- doubleComplex * pdblLeftvectors = NULL; /* Used by LAPACK */
-
-
-
+
/* Data initialization */
eigenvalues = malloc((uint)(rows*rows)*sizeof(doubleComplex));
eigenvectors = malloc((uint)(rows*rows)*sizeof(doubleComplex));
tmp = malloc((uint)(rows*rows)*sizeof(doubleComplex));
- iWorkSize = max(1,2*rows);
- pdblWork = malloc((uint)(iWorkSize)*sizeof(doubleComplex));
- pdblRWork = malloc((uint)(2*rows)*sizeof(doubleComplex));
-
- /* Copy in in inCopy */
- for (i=0;i<rows*rows;i++)
- out[i] = in[i];
-
/* regarde si in est hermitienne */
- ztransposea(in,rows,rows,tmp);
- zconja(tmp,rows*rows,tmp);
- for (i=0;i<rows*rows;i++){
- if ( (zreals(in[i])!=zreals(tmp[i])) || (zimags(in[i])!=zimags(tmp[i])) ) break;
+ for (i=0;i<rows;i++){
+ for(j=0;j<rows;j++)
+ if ( (zreals(in[i+j*rows])!=zreals(in[j+i*rows])) ||
+ (zimags(in[i+j*rows])!=zimags(in[j+i*rows])) ) break;
+ if (j!=rows) break;
}
- if (i==rows*rows) hermitienne = 1;
+ if ((i==rows) && (j==rows)) hermitienne=1;
/* trouver les valeurs propres vp ainsi que les vecteurs propres*/
- if (hermitienne){
- printf("wazaaaaaaa\n");
- C2F(zheev)( "V", "U", &rows, out, &rows, eigenvalues,
- pdblWork, &iWorkSize, pdblRWork, &info );
- /* stocker les valeurs propres comme il faut parce qu'elle sont mal rangées
- une fois sorties de zheev*/
- for(i=rows-1;i>=0;i--) {
- /* on le fait en descendant sinon on écrase l'element 0 alors qu'il doit etre réutilisé
- ---> erreur */
- if ( ((i+i*rows)/rows)%2 == 0)
- eigenvalues[i*rows+i] = DoubleComplex(zreals(eigenvalues[(i*rows+i)/(2*rows)]),0);
- else eigenvalues[i*rows+i] = DoubleComplex(zimags(eigenvalues[(i*rows+i)/(2*rows)]),0);
- }
- for (i=1;i<rows;i++) eigenvalues[i]=DoubleComplex(0,0);
- eigenvectors = out;
-
- }
- else {
- printf("passe\n");
- C2F(zgeev)( "N", "V", &rows, out, &rows, eigenvalues,
- pdblLeftvectors, &rows, eigenvectors, &rows, pdblWork, &iWorkSize,
- pdblRWork, &info );
- for(i=0;i<rows;i++) {
- eigenvalues[i*rows+i] = eigenvalues[i];
- if ((i*rows+i)!=i) eigenvalues[i] = DoubleComplex(0,0);
- }
- }
+ zspec2a(in,rows,eigenvalues,eigenvectors);
/* utiliser la formule suivante
* logm = Vp * diag(log(diag(vp)) * inv(Vp) */
-
+
/* diag(log(diag(vp)) */
for (i=0;i<rows*rows;i++){
if ((i%(rows+1))==0) /* teste si i est sur la diagonale */
@@ -108,6 +69,8 @@ void zlogma (doubleComplex* in, int rows, doubleComplex* out){
else eigenvalues[i] = DoubleComplex(0,0);
}
+
+
/* Vp * diag(log(diag(vp)) */
zmulma(eigenvectors, rows, rows, eigenvalues, rows, rows, tmp);
@@ -122,13 +85,9 @@ void zlogma (doubleComplex* in, int rows, doubleComplex* out){
/* Vp * diag(log(diag(vp))*inv(Vp) */
zmulma(tmp, rows, rows, eigenvectors, rows, rows, out);
-
- /* FIXME : pb with eigenvectors */
- eigenvectors=NULL;
+
free(eigenvalues);
free(eigenvectors);
free(tmp);
- free(pdblWork);
- free(pdblRWork);
}