summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjofret2009-04-22 06:00:11 +0000
committerjofret2009-04-22 06:00:11 +0000
commit2424c9dba444d024f6353639bdc6fd2a8042c8aa (patch)
treed2ef4caa49ca2ba7ed23509fec2914a6744ca11e
parent8340a747961457c8766eae08f098519749f7a785 (diff)
downloadscilab2c-2424c9dba444d024f6353639bdc6fd2a8042c8aa.tar.gz
scilab2c-2424c9dba444d024f6353639bdc6fd2a8042c8aa.tar.bz2
scilab2c-2424c9dba444d024f6353639bdc6fd2a8042c8aa.zip
uint -> unsigned int
-rw-r--r--scilab2c/src/matrixOperations/logm/zlogma.c71
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);
}