diff options
Diffstat (limited to 'src/matrixOperations/logm/clogma.c')
-rw-r--r-- | src/matrixOperations/logm/clogma.c | 75 |
1 files changed, 9 insertions, 66 deletions
diff --git a/src/matrixOperations/logm/clogma.c b/src/matrixOperations/logm/clogma.c index f64e574c..ebad5814 100644 --- a/src/matrixOperations/logm/clogma.c +++ b/src/matrixOperations/logm/clogma.c @@ -13,80 +13,23 @@ #include <malloc.h> #include "logm.h" -#include "schur.h" -#include "log.h" -#include "multiplication.h" -#include "tranpose.h" -#include "inverse.h" - -static void bdiag(floatComplex *in, int size, double n, floatComplex *out1, floatComplex *out2){ - -} - void clogma (floatComplex* in, int size, floatComplex* out){ - doubleComplex *out1, *out2, *dtmp; - int i=0, egaux=0; - float eps = 2.220e-16; - int select, sdim, lwork, bwork, info = 0; - doubleComplex *eigenvalues, *work, *rwork; - - - out1=malloc((uint)(size*size)*sizeof(doubleComplex)); - out2=malloc((uint)(size*size)*sizeof(doubleComplex)); - dtmp=malloc((uint)(size*size)*sizeof(doubleComplex)); - eigenvalues=malloc((uint)size*sizeof(doubleComplex)); - work=malloc((uint)(pow(2,size))*sizeof(doubleComplex)); - rwork=malloc((uint)size*sizeof(doubleComplex)); - - ctransposea(in,size,size,tmp);/*pb entre float et double*/ - - for (i=0;i<size*size;i++){ - if (in[i]!=tmp[i]) break; - } - if (i==size*size) egaux =1; - - - if (egaux){ - /*Hermitian matrix*/ - for (i=0;i<size*size,i++) - out1[i]=DoubleComplex((double)creals(in[i]),(double)cimags(in[i]));; - - C2F(zgees)("V","S", &select, &size, out1, &size, &sdim, eigenvalues, out2, &size, work, &lwork, rwork, &bwork, &info); - - for (i=0;i<size;i++){ - for (j=0;j<size;j++){ - tmp[i*size+j]=0; - if (i==j) dtmp[i*size+j]=zlogs(out2[i*size+j]); - } - } - - zmulma(out1,size,size,dtmp,size,size,out2); - ztransposea(out1,size,size,dtmp); + doubleComplex *inCopy, *outCopy; + int i=0; - cmula(out2,size,size,tmp,size,size,out1); - for (i=0;i<size*size,i++) - out[i]=FloatComplex((float)zreals(in[i]),(float)zimags(in[i]));; - } - else - { - /*General Matrix*/ - bdiag(in, size, eps, out1, out2); + inCopy = malloc((uint)(size*size)*sizeof(doubleComplex)); + outCopy = malloc((uint)(size*size)*sizeof(doubleComplex)); + for(i=0;i<size*size;i++) + inCopy[i]=DoubleComplex ((double)creals(in[i]), (double)cimags(in[i])); - for (i=0;i<size;i++){ - for (j=0;j<size;j++){ - tmp[i*size+j]=0; - if (i==j) tmp[i*size+j]=clogs(out2[i*size+j]); - } - } - out2 = cmulma(out1,tmp); - tmp = cinversea(out1,size,size,out1); + zlogma(inCopy,size,outCopy); - out= cmula(out2,tmp); - } + for(i=0;i<size*size;i++) + out[i]=FloatComplex( (float)zreals(outCopy[i]),(float)zimags(outCopy[i])); } |