summaryrefslogtreecommitdiff
path: root/src/matrixOperations/division/srdiva.c
diff options
context:
space:
mode:
authorsimon2008-07-23 08:05:47 +0000
committersimon2008-07-23 08:05:47 +0000
commit8ee66b49b57cc4564691de8ebad15bccd3601cc4 (patch)
tree1b1b8878f850750cbc432d1361ca04eaaf722fa3 /src/matrixOperations/division/srdiva.c
parenta957d9dca9cd35129023bedf1f2de260c7d1a867 (diff)
downloadscilab2c-8ee66b49b57cc4564691de8ebad15bccd3601cc4.tar.gz
scilab2c-8ee66b49b57cc4564691de8ebad15bccd3601cc4.tar.bz2
scilab2c-8ee66b49b57cc4564691de8ebad15bccd3601cc4.zip
float and double right division and left division work with scalar matrixes, still problem with complex matrixes
Diffstat (limited to 'src/matrixOperations/division/srdiva.c')
-rw-r--r--src/matrixOperations/division/srdiva.c134
1 files changed, 20 insertions, 114 deletions
diff --git a/src/matrixOperations/division/srdiva.c b/src/matrixOperations/division/srdiva.c
index f6ae4a9d..343ba9c9 100644
--- a/src/matrixOperations/division/srdiva.c
+++ b/src/matrixOperations/division/srdiva.c
@@ -20,19 +20,8 @@
void srdiva ( float* in1, int lines1, int columns1 ,
float* in2, int lines2, int columns2 ,
float* out ){
- char cNorm = 0;
- int iExit = 0;
- int i = 0 ,j = 0 ,ij = 0 ,ji = 0;
- /*temporary variables*/
- int iWork = 0;
- int iInfo = 0;
- int iMax = 0;
- double dblRcond = 0;
-
- double dblEps = 0;
- double dblAnorm = 0;
-
+ int i = 0 ;
/* these 3 variable are created to permit to use the value in the fortran functions
because they need double matrix as arguments and we can't cast directly the pointers
without having problems , i know that's ugly */
@@ -40,120 +29,37 @@ void srdiva ( float* in1, int lines1, int columns1 ,
double *dblin2 = NULL;
double *dblout = NULL;
- double *pAf = NULL;
- double *pAt = NULL;
- double *pBt = NULL;
- double *pDwork = NULL;
-
- int *pRank = NULL;
- int *pIpiv = NULL;
- int *pJpvt = NULL;
- int *pIwork = NULL;
-
- iWork = Max(4 * columns2, Max(Min(lines2, columns2) + 3 * lines2 + 1, 2 * Min(lines2, columns2) + lines1));
-
-
/* Array allocations*/
- dblin1 = (double*)malloc(sizeof(double) * (unsigned int)columns2 * (unsigned int)lines2);
- dblin2 = (double*)malloc(sizeof(double) * (unsigned int)columns1 * (unsigned int)lines1);
- dblout = (double*)malloc(sizeof(double) * (unsigned int)Max(lines2,columns2) * (unsigned int)lines1);
-
- pAf = (double*)malloc(sizeof(double) * (unsigned int)columns2 * (unsigned int)lines2);
- pAt = (double*)malloc(sizeof(double) * (unsigned int)columns2 *(unsigned int) lines2);
- pBt = (double*)malloc(sizeof(double) * (unsigned int)Max(lines2,columns2) * (unsigned int)lines1);
+ dblin1 = (double*)malloc(sizeof(double) * (unsigned int)columns1 * (unsigned int)lines1);
+ dblin2 = (double*)malloc(sizeof(double) * (unsigned int)columns2 * (unsigned int)lines2);
+ dblout = (double*)malloc(sizeof(double) * (unsigned int)lines1 * (unsigned int)lines2);
- pRank = (int*)malloc(sizeof(int));
- pIpiv = (int*)malloc(sizeof(int) * (unsigned int)columns2);
- pJpvt = (int*)malloc(sizeof(int) * (unsigned int)lines2);
- pIwork = (int*)malloc(sizeof(int) * (unsigned int)columns2);
- cNorm = '1';
- pDwork = (double*)malloc(sizeof(double) * (unsigned int)iWork);
- dblEps = getRelativeMachinePrecision() ;
- dblAnorm = dlange_(&cNorm, &lines2, &columns1, dblin2, &lines2, pDwork);
-
/*copy and cast all the float value into double value */
- for ( i = 0 ; i < lines2 * columns2 ; i ++ )
- {
-
- dblin1[i] = (double) in1[i] ;
- printf ( "dbl in1 = %e \n" , dblin1 [i] );
- }
-
for ( i = 0 ; i < lines1 * columns1 ; i ++ )
- dblin2[i] = (double) in2[i] ;
-
-
- /*tranpose A and B*/
-
- dtransposea(dblin1, lines2, columns2, pAt);
- dtransposea(dblin2, lines1, columns2, pBt);
-
- if(lines2 == columns2)
- {
- cNorm = 'F';
- dlacpy_(&cNorm, &columns2, &columns2, pAt, &columns2, pAf, &columns2);
- dgetrf_(&columns2, &columns2, pAf, &columns2, pIpiv, &iInfo);
- if(iInfo == 0)
- {
- cNorm = '1';
- dgecon_(&cNorm, &columns2, pAf, &columns2, &dblAnorm, &dblRcond, pDwork, pIwork, &iInfo);
- if(dblRcond > sqrt(dblEps))
- {
- cNorm = 'N';
- dgetrs_(&cNorm, &columns2, &lines1, pAf, &columns2, pIpiv, pBt, &columns2, &iInfo);
- dtransposea(pBt, columns2, lines1, dblout);
- iExit = 1;
- }
+ {
+ dblin1[i] = (double) in1[i] ;
}
- }
-
- if(iExit == 0)
- {
- dblRcond = sqrt(dblEps);
- cNorm = 'F';
- iMax = Max(lines2, columns2);
- memset(pJpvt, 0x00, (unsigned int)sizeof(int) * (unsigned int)lines2);
- dgelsy_(&columns2, &lines2, &lines1, pAt, &columns2, pBt, &iMax,
- pJpvt, &dblRcond, &pRank[0], pDwork, &iWork, &iInfo);
-
- if(iInfo == 0)
- {
-
+ for ( i = 0 ; i < lines2 * columns2 ; i ++ )
+ {
+ dblin2[i] = (double) in2[i] ;
+ }
+
+ drdiva( dblin1 , lines1 , columns1 , dblin2 , lines2 , columns2 , dblout );
- /* TransposeRealMatrix(pBt, lines1, lines2, out, Max(lines1,columns1), lines2);*/
+
+ for ( i = 0 ; i < Min(lines2,columns2) * lines1 ; i++ )
+ {
+ out[i] = (float) dblout[i] ;
- /*Mega caca de la mort qui tue des ours a mains nues
- mais je ne sais pas comment le rendre "beau" :(*/
- {
-
- for(j = 0 ; j < lines2 ; j++)
- {
- for(i = 0 ; i < lines1 ; i++)
- {
- ij = i + j * lines1;
- ji = j + i * Max(lines2, columns2);
- dblout[ij] = pBt[ji];
- }
- }
- }
- }
- }
+ }
- for ( i = 0 ; i < Max(lines2,columns2) * lines1 ; i++ )
- out[i] = (float) dblout[i] ;
-
- free(pAf);
- free(pAt);
- free(pBt);
- free(pRank);
- free(pIpiv);
- free(pJpvt);
- free(pIwork);
- free(pDwork);
+ free ( dblin1);
+ free ( dblin2);
+ free ( dblout);
}