⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix_skyline.c

📁 有限元程序
💻 C
📖 第 1 页 / 共 5 页
字号:
     UNITS_SWITCH = CheckUnits();    /* [a] : Check for compatible matrix dimensions and data types */       if((spA == NULL) || (spB == NULL))          FatalError("In MatrixAddSkyline() : Either spA = NULL or spB = NULL",                    (char *) NULL);       if(spA->eRep != spA->eRep)           FatalError("In MatrixAddSkyline() : spA->eRep != spB->eRep",                    (char *) NULL );       if(spA->eType != spB->eType)           FatalError("In MatrixAddSkyline() : spA->eType != spB->eType",                    (char *) NULL);    /* [b] : Compute Skyline Profile for [A] + [B] */       ld = iVectorAlloc( spA->iNoColumns );        for(ii = 0; ii < spA->iNoColumns; ii++)            ld[ii] = (int) MAX (spA->uMatrix.daa[ii][0], spB->uMatrix.daa[ii][0]);    /* [c] : Allocate Skyline Matrix for [C] : [C] = [A] + [B] */       spC = MatrixAllocSkyline((char *)NULL,DOUBLE_ARRAY,spA->iNoRows, spA->iNoColumns, ld);    /* [d] : Compute [C] = [A] + [B] */       switch( UNITS_SWITCH) {         case ON:            for(ii = 1; ii <= spA->iNoRows; ii++)                UnitsCopy( &(spC->spRowUnits[ii-1]), &(spA->spRowUnits[ii-1]) );            for(ij = 1; ij <= spA->iNoColumns; ij++)                UnitsCopy( &(spC->spColUnits[ij-1]), &(spA->spColUnits[ij-1]) );         /* [b] : Check Units and Add Matrices : [C] = [A] + [B] */            for(ii = 0; ii < spA->iNoColumns; ii++) {                min_ldi = (int) MIN ( spA->uMatrix.daa[ii][0], spB->uMatrix.daa[ii][0]);                for(ij = 1; ij <= spA->iNoColumns; ij++) {                    d1 = UnitsMult( &(spA->spRowUnits[ii]), &(spA->spColUnits[ij-1]) );                    d2 = UnitsMult( &(spB->spRowUnits[ii]), &(spB->spColUnits[ij-1]) );                    if(SameUnits(d1, d2) == TRUE) {                       if( ij <= min_ldi )                          spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij]                                                    + spB->uMatrix.daa[ii][ij];                       else if( (spA->uMatrix.daa[ii][0] > min_ldi) && (ij <= ld[ii]) )                           spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij];                       else if( (spB->uMatrix.daa[ii][0] > min_ldi) && (ij <= ld[ii]) )                           spC->uMatrix.daa[ii][ij] = spB->uMatrix.daa[ii][ij];                    }                    else {                       printf("For row No %d, column No %d \n", ii, ij);                       FatalError(" In MatrixAddIndirectDouble(): Inconsistent Units",                                    (char *)NULL);                    }                    free((char *) d1->units_name);                    free((char *) d1);                    free((char *) d2->units_name);                    free((char *) d2);                }            }            break;         case OFF:            for(ii = 0; ii < spA->iNoColumns; ii++) {                min_ldi = (int) MIN ( spA->uMatrix.daa[ii][0], spB->uMatrix.daa[ii][0]);                for(ij = 1; ij <= min_ldi; ij++)                    spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij] +                                               spB->uMatrix.daa[ii][ij];                if( spA->uMatrix.daa[ii][0] > min_ldi)                     for(ij = min_ldi+1; ij <= ld[ii]; ij++)                         spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij];                                 if( spB->uMatrix.daa[ii][0] > min_ldi)                     for(ij = min_ldi+1; ij <= ld[ii]; ij++)                         spC->uMatrix.daa[ii][ij] = spB->uMatrix.daa[ii][ij];            }            break;         default:            break;       }       spC = MatrixReallocSkyline ( spC );       free((char *) ld);       return ( spC );}/* *  ======================================================================= *  MatrixSubSkyline() : Subtract two Skyline Matrices *  *  Input  :  MATRIX *spA        -- Pointer to matrix data structure. *         :  MATRIX *spB        -- Pointer to matrix data structure. *  Output :  MATRIX *spC        -- Pointer to matrix differnce. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixSubSkyline( MATRIX *spA , MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixSubSkyline( spA, spB )MATRIX *spA, *spB;#endif /* End case not STDC */{MATRIX *spC;int *ld, min_ldi;int  ii, ij;int  length, length1, length2;DIMENSIONS *d1, *d2;int UNITS_SWITCH;     UNITS_SWITCH = CheckUnits();    /* [a] : Check for compatible matrix dimensions and data types */       if((spA == NULL) || (spB == NULL))          FatalError("In MatrixSubSkyline() : Either spA = NULL or spB = NULL",                    (char *) NULL);       if(spA->eRep != spA->eRep)           FatalError("In MatrixSubSkyline() : spA->eRep != spB->eRep",                    (char *) NULL );       if(spA->eType != spB->eType)           FatalError("In MatrixSubSkyline() : spA->eType != spB->eType",                    (char *) NULL);    /* [b] : Compute Skyline Profile for [A] - [B] */       ld = iVectorAlloc( spA->iNoRows );        for(ii = 0; ii < spA->iNoRows; ii++)            ld[ii] = (int) MAX (spA->uMatrix.daa[ii][0], spB->uMatrix.daa[ii][0]);    /* [c] : Allocate Skyline Matrix for [C] : [C] = [A] - [B] */       spC = MatrixAllocSkyline((char *)NULL, DOUBLE_ARRAY,                        spA->iNoRows, spA->iNoColumns, ld);    /* [d] : Compute [C] = [A] - [B] */       switch( UNITS_SWITCH) {         case ON:            for(ii = 1; ii <= spA->iNoRows; ii++)                UnitsCopy( &(spC->spRowUnits[ii-1]), &(spA->spRowUnits[ii-1]) );            for(ij = 1; ij <= spA->iNoColumns; ij++)                UnitsCopy( &(spC->spColUnits[ij-1]), &(spA->spColUnits[ij-1]) );         /* [b] : Check Units and Sub Matrices : [C] = [A] - [B] */            for(ii = 0; ii < spA->iNoRows; ii++) {                min_ldi = (int) MIN ( spA->uMatrix.daa[ii][0], spB->uMatrix.daa[ii][0]);                for(ij = 1; ij <= spA->iNoColumns; ij++) {                    d1 = UnitsMult( &(spA->spRowUnits[ii]), &(spA->spColUnits[ij-1]) );                    d2 = UnitsMult( &(spB->spRowUnits[ii]), &(spB->spColUnits[ij-1]) );                    if(SameUnits(d1, d2) == TRUE) {                       if( ij <= min_ldi )                          spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij]                                                   - spB->uMatrix.daa[ii][ij];                       else if( (spA->uMatrix.daa[ii][0] > min_ldi) && (ij <= ld[ii]) )                           spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij];                       else if( (spB->uMatrix.daa[ii][0] > min_ldi) && (ij <= ld[ii]) )                           spC->uMatrix.daa[ii][ij] = -spB->uMatrix.daa[ii][ij];                    }                    else {                       printf("For row No %d, column No %d \n", ii, ij);                       FatalError("In MatrixSubIndirectDouble(): Inconsistent Units",                                   (char *)NULL);                    }                    free((char *) d1->units_name);                    free((char *) d1);                    free((char *) d2->units_name);                    free((char *) d2);                }            }            break;         case OFF:            for(ii = 0; ii < spA->iNoRows; ii++) {                min_ldi = (int) MIN ( spA->uMatrix.daa[ii][0], spB->uMatrix.daa[ii][0]);                for(ij = 1; ij <= min_ldi; ij++)                    spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij] -                                               spB->uMatrix.daa[ii][ij];                if( spA->uMatrix.daa[ii][0] > min_ldi)                     for(ij = min_ldi+1; ij <= ld[ii]; ij++)                         spC->uMatrix.daa[ii][ij] = spA->uMatrix.daa[ii][ij];                                 if( spB->uMatrix.daa[ii][0] > min_ldi)                     for(ij = min_ldi+1; ij <= ld[ii]; ij++)                         spC->uMatrix.daa[ii][ij] = -spB->uMatrix.daa[ii][ij];            }            break;         default:            break;       }       spC = MatrixReallocSkyline ( spC );       free((char *) ld);       return ( spC );}/* *  ======================================================================= *  MatrixMultSkyline() : Multiply two Skyline Matrices. *  *  Input  :  MATRIX *spA -- Pointer to matrix data structure [A]. *         :  MATRIX *spB -- Pointer to matrix data structure [B]. *  Output :  MATRIX *spC -- Pointer to matrix product [C] = [A]*[B] *  *  Note : If [A] and [B] are symmetric, then [A]*[B] is symmetric only iff *         [A]*[B] = [B]*[A]. In general, this condition will not hold -- so *         we store matrix product [ma]*[mb] in INDIRECT form. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixMultSkyline( MATRIX *spA, MATRIX *spB )#else  /* Start case not STDC */MATRIX *MatrixMultSkyline( spA, spB )MATRIX *spA;MATRIX *spB;#endif /* End case not STDC */{MATRIX *spC;int ii, ij, ik, init;int im, in, kka, kkb;int  length1, length2, length;DIMENSIONS *d1, *d2, *d3, *d4, *d5;int UNITS_SWITCH;#define DEBUG#ifdef DEBUG       printf("*** Enter MatrixMultSkyline()\n");#endif     UNITS_SWITCH = CheckUnits();    /* [a] : Check for compatible matrix dimensions and data types etc... */       if((spA == NULL) || (spB == NULL))          FatalError("In MatrixMultSkyline() : Either spA = NULL or spB = NULL",                    (char *) NULL);       if(spA->eRep != spB->eRep)           FatalError("In MatrixMultSkyline() : spA->eRep != spB->eRep",                    (char *) NULL);       if(spA->eType != spB->eType)           FatalError("In MatrixMultSkyline() : spA->eType != spB->eType",                    (char *) NULL);       if(spA->iNoColumns != spB->iNoRows)           FatalError("In MatrixMultSkyline() : spA->iNoColumns != spB->iNoRows",                    (char *) NULL);    /* [b] : Allocate Memory for Matrix Product */       spC = MatrixAllocIndirect( (char *) NULL, DOUBLE_ARRAY,                               spA->iNoRows, spB->iNoColumns);     /* [c] : Compute elements of matrix product */       switch( UNITS_SWITCH) {         case ON:             for(ii = 1; ii <= spA->iNoRows; ii++) {               for(ij = 1; ij <= spB->iNoColumns; ij++) {                  d4 = (DIMENSIONS *) MyCalloc( 1, sizeof(DIMENSIONS) );                  ZeroUnits(d4);                  init = (int) MAX((ii - spA->uMatrix.daa[ii-1][0]+1),                                   (ij - spB->uMatrix.daa[ij-1][0]+1));                  for(ik = 1; ik <= spA->iNoColumns; ik++) {                     d1 = UnitsMult(&(spA->spRowUnits[ii-1]),&(spA->spColUnits[ik-1]));                     d2 = UnitsMult(&(spB->spRowUnits[ik-1]),&(spB->spColUnits[ij-1]));                     d3 = UnitsMult(d1,d2);                     if( ik == 1  &&  d3->units_name != (char *)NULL )                         UnitsCopy(d4, d3);                     if( ik >= init ) {                        if( SameUnits(d3,d4) == TRUE ) {                           im  = (int) MAX(ik,ii);                           kka = (int) MIN(ik,ii);                           in  = (int) MAX(ik,ij);                           kkb = (int) MIN(ik,ij);                           if((im-kka+1) <= spA->uMatrix.daa[ im-1 ][0] &&                              (in-kkb+1) <= spB->uMatrix.daa[ in-1 ][0] )                               spC->uMatrix.daa[ ii-1 ][ ij-1 ] +=                                  spA->uMatrix.daa[im-1][im-kka+1]                                 *spB->uMatrix.daa[in-1][in-kkb+1];                        }                        else                          FatalError("In MatrixMultSkyline(): Inconsistent Units",(char *)NULL);                     }                     free((char *) d1->units_name);                     free((char *) d1);                     free((char *) d2->units_name);                     free((char *) d2);                     free((char *) d3->units_name);                     free((char *) d3);                  }                  free((char *) d4->units_name);                  free((char *) d4);               }            }            for(ii = 1; ii <=  spC->iNoRows; ii++)                UnitsMultRep( &(spC->spRowUnits[ii-1]), &(spB->spRowUnits[0]),&(spA->spRowUnits[ii-1]));           for(ij = 1; ij <= spC->iNoColumns; ij++)               UnitsMultRep( &(spC->spColUnits[ij-1]), &(spA->spColUnits[0]),&(spB->spColUnits[ij-1]));           break;        case OFF:            for(ii = 1; ii <= spA->iNoRows; ii++) {               for(ij = 1; ij <= spB->iNoColumns; ij++) {                  init = (int) MAX((ii - spA->uMatrix.daa[ii-1][0]+1),                                   (ij - spB->uMatrix.daa[ij-1][0]+1));                  for(ik = init; ik <= spA->iNoColumns; ik++) {                     im  = (int) MAX(ik,ii);                     kka = (int) MIN(ik,ii);                     in  = (int) MAX(ik,ij);                     kkb = (int) MIN(ik,ij);                     if((im-kka+1) <= spA->uMatrix.daa[im-1][0] &&                        (in-kkb+1) <= spB->uMatrix.daa[in-1][0] )                         spC->uMatrix.daa[ ii-1 ][ ij-1 ] +=                         spA->uMatrix.daa[im-1][im-kka+1]*spB->uMatrix.daa[in-1][in-kkb+1];                  }               }            }           break;        default:           break;      }#ifdef DEBUG       printf("*** Leaving MatrixMultSkyline()\n");#endif      return (spC);}#undef DEBUG/* *  ======================================================================= *  MatrixNegateSkyline() : Matrix Negation [B] = -[A]. *   *  Input  :  MATRIX     *spA  -- Pointer to matrix A. *  Output :  MATRIX     *spB  -- Pointer to matrix B. *  ======================================================================= */#ifdef __STDC__MATRIX *MatrixNegateSkyline( MATRIX *spA )#else  /* Start case not STDC */MATRIX *MatrixNegateSkyline( spA )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -