Beispiel #1
0
int main(void)
{
    float a11, a12, a13, a21, a22, a23, a31, a32, a33;

    a11= -0.558253; a12 = -0.0461681; a13 = -0.505735;
    a21 = -0.411397; a22 = 0.0365854; a23 = 0.199707;
    a31 = 0.285389; a32 =-0.313789; a33 = 0.200189;

    // printf("Original Matrix:\n");
    // printMat3(a11, a12, a13, a21, a22, a23, a31, a32, a33);

    float u11, u12, u13, u21, u22, u23, u31, u32, u33;
    float s11, s12, s13, s21, s22, s23, s31, s32, s33;
    float v11, v12, v13, v21, v22, v23, v31, v32, v33;

    clock_t start, end;
    start = clock();
    for (int i=0; i<1e6; i++)
    {
        svd(a11, a12, a13, a21, a22, a23, a31, a32, a33,
        u11, u12, u13, u21, u22, u23, u31, u32, u33,
        s11, s12, s13, s21, s22, s23, s31, s32, s33,
        v11, v12, v13, v21, v22, v23, v31, v32, v33);
    }    
    end = clock();

    printf("Average SVD takes %f microseconds \n ", 1e6*(double(end - start) / 1e6 / CLOCKS_PER_SEC ) );
    
    printf("U:\n");
    printMat3(u11, u12, u13, u21, u22, u23, u31, u32, u33);
    printf("S:\n");
    printMat3(s11, s12, s13, s21, s22, s23, s31, s32, s33);
    printf("V:\n");
    printMat3(v11, v12, v13, v21, v22, v23, v31, v32, v33);

    float t11, t12, t13, t21, t22, t23, t31, t32, t33;
    multAB(u11, u12, u13, u21, u22, u23, u31, u32, u33,
           s11, s12, s13, s21, s22, s23, s31, s32, s33,
           t11, t12, t13, t21, t22, t23, t31, t32, t33);

    float m11, m12, m13, m21, m22, m23, m31, m32, m33;
    multAB(t11, t12, t13, t21, t22, t23, t31, t32, t33,
           v11, v21, v31, v12, v22, v32, v13, v23, v33,
           m11, m12, m13, m21, m22, m23, m31, m32, m33);

    printf("USV* : \n");
    printMat3(m11, m12, m13, m21, m22, m23, m31, m32, m33);

    return 0;

}
Beispiel #2
0
void applyWeights(matrix * X, matrix * w, matrix * yhat)
{
    /* X*w -> yhat */
    int last = getTimer();
    
    multAB(X,w,yhat);
    
    if(opt->verbose==3 || opt->verbose==7)
        print("applyWeights TIME: %i SECONDS\n\n",getTimer()-last); 
}
Beispiel #3
0
// =============================
// multiply:   C = op(A) * op(B)
// =============================
void mulMatMat(double* C, double* A, double* B,
				   const int rA, const int cA, const int rB, const int cB, const char *mod) {
#ifndef USE_BLAS // naive C implementations

   if ( (mod[0] == 'N') && (mod[1] == 'N') )
      multAB(C, A, B,rA, cA, cB);
   else if ( (mod[0] == 'T') && (mod[1] == 'N') )
      multAtB(C, A, B, rA, cA, cB);
   else if ( (mod[0] == 'N') && (mod[1] == 'T') )
      multABt(C, A, B, rA, cA, rB);
   else if ( (mod[0] == 'T') && (mod[1] == 'T') )
      multAtBt(C, A, B, rA, cA, rB);

#else

   // rows(Op(A)), columns(Op(A)), columns(Op(B)), rows(C)
   ptrdiff_t ropA, copA, copB, rC;  
   // can't pass consts to fortran
   ptrdiff_t rA0 = rA, rB0 = rB;    

   char modA = mod[0], modB = mod[1];
   double one = 1.0, zero = 0.0;

   if (mod[0] != 'S'){
      if ( (mod[0] == 'N') && (mod[1] == 'N') ){
         ropA  = rA;
         copA  = cA;   
         copB  = cB;
         rC    = rA;
      } else if ( (mod[0] == 'T') && (mod[1] == 'N') ){
         ropA  = cA;
         copA  = rA;   
         copB  = cB;
         rC    = cA;   
      } else if ( (mod[0] == 'N') && (mod[1] == 'T') ){
         ropA  = rA;
         copA  = cA;   
         copB  = rB;
         rC    = rA;   
      } else if ( (mod[0] == 'T') && (mod[1] == 'T') ){
         ropA  = cA;
         copA  = rA;   
         copB  = rB;
         rC    = cA;   
      }
      dgemm(&modA, &modB, &ropA, &copB, &copA, &one, A, &rA0, B, &rB0, &zero, C, &rC);
   } else {  
      char side='L', uplo = 'U';
      ropA  = rA;
      copB  = cB;     
      dsymm(&side, &uplo, &ropA, &copB,        &one, A, &rA0, B, &rB0, &zero, C, &rC);
      // why the f**k does this not work ???
   }
#endif
}