diff options
author | jofret | 2009-04-22 06:00:11 +0000 |
---|---|---|
committer | jofret | 2009-04-22 06:00:11 +0000 |
commit | 2424c9dba444d024f6353639bdc6fd2a8042c8aa (patch) | |
tree | d2ef4caa49ca2ba7ed23509fec2914a6744ca11e | |
parent | 8340a747961457c8766eae08f098519749f7a785 (diff) | |
download | scilab2c-2424c9dba444d024f6353639bdc6fd2a8042c8aa.tar.gz scilab2c-2424c9dba444d024f6353639bdc6fd2a8042c8aa.tar.bz2 scilab2c-2424c9dba444d024f6353639bdc6fd2a8042c8aa.zip |
uint -> unsigned int
-rw-r--r-- | scilab2c/src/matrixOperations/logm/zlogma.c | 71 |
1 files changed, 45 insertions, 26 deletions
diff --git a/scilab2c/src/matrixOperations/logm/zlogma.c b/scilab2c/src/matrixOperations/logm/zlogma.c index e84a3d4e..92441bf7 100644 --- a/scilab2c/src/matrixOperations/logm/zlogma.c +++ b/scilab2c/src/matrixOperations/logm/zlogma.c @@ -28,55 +28,74 @@ void zlogma (doubleComplex* in, int rows, doubleComplex* out){ /* find eigenvalues and eigenvectors */ /* use formula * logm = Vp * diag(log(diag(vp)) * inv(Vp) */ - - + + int i = 0,j = 0; - doubleComplex *eigenvalues, *eigenvectors, *tmp; + doubleComplex *eigenvalues, *eigenvectors, *tmp, *tmp2; int hermitienne = 0; - - + + /* Data initialization */ - eigenvalues = (doubleComplex*)malloc((unsigned int)(rows*rows)*sizeof(doubleComplex)); - eigenvectors = (doubleComplex*)malloc((unsigned int)(rows*rows)*sizeof(doubleComplex)); - tmp = (doubleComplex*)malloc((unsigned int)(rows*rows)*sizeof(doubleComplex)); - - - - - + eigenvalues = (doubleComplex*) malloc( (unsigned int) (rows*rows)*sizeof(doubleComplex)); + eigenvectors = (doubleComplex*) malloc( (unsigned int) (rows*rows)*sizeof(doubleComplex)); + tmp = (doubleComplex*) malloc( (unsigned int) (rows*rows)*sizeof(doubleComplex)); + tmp2 = (doubleComplex*) malloc( (unsigned int) (rows*rows)*sizeof(doubleComplex)); + + + + + /* hermitian test */ for (i=0;i<rows;i++){ for(j=0;j<rows;j++) - if ( (zreals(in[i+j*rows])!=zreals(in[j+i*rows])) || + 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) && (j==rows)) hermitienne=1; - + if ((i==rows) && (j==rows)) { + hermitienne=0; + } + /* find eigenvalues and eigenvectors */ zspec2a(in,rows,eigenvalues,eigenvectors); /* make operation on eigenvalues and eigenvectors */ - for (i=0;i<rows;i++){ + /* + for (i=0;i < rows;i++) { eigenvalues[i+i*rows] = zlogs(eigenvalues[i+i*rows]); } - - + */ + + for (i=0;i < rows*rows;i++) { + if (zreals(eigenvalues[i]) == 0 && zimags(eigenvalues[i]) == 0) { + eigenvalues[i]=DoubleComplex(-0.0, 0.0); + } + else { + eigenvalues[i]=zlogs(eigenvalues[i]); + } + + } + /* + zloga(eigenvalues, rows*rows, eigenvalues); + */ + zmulma(eigenvectors, rows, rows, eigenvalues, rows, rows, tmp); - + if (hermitienne) { /* we use eigenvalues as a temporary matrix cause it's useless now*/ ztransposea(eigenvectors,rows,rows,eigenvalues); - zconja(eigenvalues,rows*rows,eigenvalues); + zconja(eigenvalues,rows*rows,tmp2); + } + else { + zinverma(eigenvectors, tmp2, rows); } - else zinverma(eigenvectors, eigenvalues, rows); - - zmulma(tmp, rows, rows, eigenvalues, rows, rows, out); - + + zmulma(tmp, rows, rows, tmp2, rows, rows, out); + free(eigenvalues); - free(eigenvectors); + free(eigenvectors); free(tmp); } |