diff options
-rw-r--r-- | scilab2c/src/matrixOperations/spec/dspeca.c | 8 | ||||
-rw-r--r-- | scilab2c/src/matrixOperations/spec/sspeca.c | 8 | ||||
-rw-r--r-- | scilab2c/src/matrixOperations/spec/testDoubleSpec.c | 23 | ||||
-rw-r--r-- | scilab2c/src/matrixOperations/spec/testFloatSpec.c | 41 |
4 files changed, 29 insertions, 51 deletions
diff --git a/scilab2c/src/matrixOperations/spec/dspeca.c b/scilab2c/src/matrixOperations/spec/dspeca.c index c86f3983..6a4d2c61 100644 --- a/scilab2c/src/matrixOperations/spec/dspeca.c +++ b/scilab2c/src/matrixOperations/spec/dspeca.c @@ -18,7 +18,7 @@ #include "stdio.h" -void dspeca(double* in, int rows,doubleComplex* out){ +void dspeca(double* in, int rows,double* out){ int i=0, j=0; int symmetric=0; int INFO=0; @@ -52,17 +52,15 @@ void dspeca(double* in, int rows,doubleComplex* out){ /* apply lapack function according to symmetry */ - if(symmetric){ - + if(symmetric){ C2F(dsyev)( "N", "U", &rows, in, &rows, outReal, pdblWork, &iWorkSize, &INFO ); - dzerosa(outImag,1,rows); } else { C2F(dgeev)( "N", "N", &rows, inCopy, &rows, outReal, outImag, pdblLeftvectors, &rows, pdblRightvectors, &rows, pdblWork, &iWorkSize, &INFO ); } - for (i=0;i<rows;i++) out[i]=DoubleComplex(outReal[i],outImag[i]); + for (i=0;i<rows;i++) out[i]=outReal[i]; free(inCopy); diff --git a/scilab2c/src/matrixOperations/spec/sspeca.c b/scilab2c/src/matrixOperations/spec/sspeca.c index 03c56ef6..55da48c4 100644 --- a/scilab2c/src/matrixOperations/spec/sspeca.c +++ b/scilab2c/src/matrixOperations/spec/sspeca.c @@ -15,20 +15,20 @@ -void sspeca(float* in, int rows, floatComplex* out){ +void sspeca(float* in, int rows, float* out){ /* As we use Lapack to find the eigenvalues, we must cast the float input into double and the doubleComplex output of dspeca into floatComplex*/ int i; double* dblin; - doubleComplex* dblout; + double* dblout; dblin=malloc((uint)(rows*rows)*sizeof(double)); - dblout=malloc((uint)rows*sizeof(doubleComplex)); + dblout=malloc((uint)rows*sizeof(double)); for (i=0;i<rows*rows;i++) dblin[i]=(double)in[i]; dspeca(dblin,rows,dblout); - for (i=0;i<rows;i++) out[i]=FloatComplex((float)zreals(dblout[i]),(float)zimags(dblout[i])); + for (i=0;i<rows;i++) out[i]=(float)dblout[i]; } diff --git a/scilab2c/src/matrixOperations/spec/testDoubleSpec.c b/scilab2c/src/matrixOperations/spec/testDoubleSpec.c index b7abbea9..c5422ca3 100644 --- a/scilab2c/src/matrixOperations/spec/testDoubleSpec.c +++ b/scilab2c/src/matrixOperations/spec/testDoubleSpec.c @@ -19,35 +19,20 @@ static void dspecaTest(void){ double in[4]={1,1,1,3}; double resultR[2]={0.5857864376269050765700,3.4142135623730949234300}; - double resultI[2]={0,0}; - - double in2[4]={1,1,-2,3}; - double result2R[2]={1.9999999999999997779554,1.9999999999999997779554}; - double result2I[2]={0.9999999999999997779554,-0.9999999999999997779554}; - doubleComplex *out; + + double *out; int i; - out=malloc((uint)2*sizeof(doubleComplex)); + out=malloc((uint)2*sizeof(double)); dspeca(in,2,out); for(i=0;i<2;i++){ - if (zreals(out[i])>1e-16) assert( fabs(zreals(out[i])-resultR[i]) / fabs(zreals(out[i])) <1e-15); - else assert(1); - if (zimags(out[i])>1e-16) assert( fabs(zimags(out[i])-resultI[i]) / fabs(zimags(out[i])) <1e-16); + if (out[i]>1e-16) assert( fabs(out[i]-resultR[i]) / fabs(out[i]) <1e-15); else assert(1); } - - - dspeca(in2,2,out); - for(i=0;i<2;i++){ - if (zreals(out[i])>1e-16) assert( fabs(zreals(out[i])-result2R[i]) / fabs(zreals(out[i])) <1e-16); - else assert(1); - if (zimags(out[i])>1e-16) assert( fabs(zimags(out[i])-result2I[i]) / fabs(zimags(out[i])) <1e-15); - else assert(1); - } } diff --git a/scilab2c/src/matrixOperations/spec/testFloatSpec.c b/scilab2c/src/matrixOperations/spec/testFloatSpec.c index 421746ff..2cd8f45e 100644 --- a/scilab2c/src/matrixOperations/spec/testFloatSpec.c +++ b/scilab2c/src/matrixOperations/spec/testFloatSpec.c @@ -19,42 +19,37 @@ static void sspecaTest(void){ float in[4]={1.0f,1.0f,1.0f,3.0f}; float resultR[2]={0.5857864376269050765700f,3.4142135623730949234300f}; - float resultI[2]={0.0f,0.0f}; + + float in1[4]={0.0f,4.0f,1.0f,0.0f}; + float result[2]={2.0f,-2.0f}; float in2[4]={1.0f,1.0f,-2.0f,3.0f}; - float result2R[2]={1.9999999999999997779554f,1.9999999999999997779554f}; - float result2I[2]={0.9999999999999997779554f,-0.9999999999999997779554f}; - - floatComplex *out; + + float *out; int i; - out=malloc((uint)2*sizeof(floatComplex)); + out=malloc((uint)2*sizeof(float)); sspeca(in,2,out); - for (i=0;i<2;i++) printf("%f+%f*i\n",creals(out[i]) ,cimags(out[i])); + for (i=0;i<2;i++) printf("%f\n",out[i]); for(i=0;i<2;i++){ - if (creals(out[i])>1e-16) assert( fabs(creals(out[i])-resultR[i]) / fabs(creals(out[i])) <1e-16); + if (out[i]>1e-16) assert( fabs(out[i]-resultR[i]) / fabs(out[i]) <1e-16); else assert(1); - if (cimags(out[i])>1e-16) assert( fabs(cimags(out[i])-resultI[i]) / fabs(cimags(out[i])) <1e-16); - else assert(1); - } - - - - sspeca(in2,2,out); - - for (i=0;i<2;i++) printf("%f+%f*i\n",creals(out[i]) ,cimags(out[i])); + } + + sspeca(in1,2,out); + for (i=0;i<2;i++) printf("%f\n",out[i]); for(i=0;i<2;i++){ - if (creals(out[i])>1e-16) assert( fabs(creals(out[i])-result2R[i]) / fabs(creals(out[i])) <1e-16); + if (out[i]>1e-16) assert( fabs(out[i]-result[i]) / fabs(out[i]) <1e-16); else assert(1); - if (cimags(out[i])>1e-16) assert( fabs(cimags(out[i])-result2I[i]) / fabs(cimags(out[i])) <1e-16); - else assert(1); - } -} - + } + + sspeca(in2,2,out); + for (i=0;i<2;i++) printf("%f\n",out[i]); +} static void cspecaTest(void){ |