cblas_sgemm 矩阵乘法

  virtual vector  get_nbest(Feature & feature_obj, int n_top=10){
    //debug_marix_get_max_use();;
    //debug_marix_head(10);
    MutexLockGuard lock(mutex_);
    // AutoWrite autowrite(&_rwlock);

    string feature_str = feature_obj.GetFeature();
    float* feat_float = nullptr;
    int d = 0;
    feature_str_to_float(feature_str, feat_float, d);

    /* cblas_sgemm(order,transA,transB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC); */
    /* 函数作用:C=alpha*A*B+beta*C */
    /*      alpha =1,beta =0 的情况下,等于两个矩阵相成。 */
    /*             第一参数 oreder 候选值 有ClasRowMajow 和ClasColMajow 这两个参数决定一维数组怎样存储在内存中, */
    /*             一般用ClasRowMajow */
    /*             参数 transA和transB :表示矩阵A,B是否进行转置。候选参数 CblasTrans 和CblasNoTrans. */
    /*             参数M:表示 A或C的行数。如果A转置,则表示转置后的行数 */
    /*             参数N:表示 B或C的列数。如果B转置,则表示转置后的列数。 */
    /*             参数K:表示 A的列数或B的行数(A的列数=B的行数)。如果A转置,则表示转置后的列数。 */
    /*             参数LDA:表示A的列数,与转置与否无关。 */
    /*             参数LDB:表示B的列数,与转置与否无关。 */
    /*             参数LDC:始终=N */

    const enum CBLAS_ORDER Order=CblasRowMajor;
    const enum CBLAS_TRANSPOSE TransA=CblasNoTrans;
    const enum CBLAS_TRANSPOSE TransB=CblasTrans;
    const int M=this->M;
    const int N=1;
    const int K=this->N;
    const float alpha=1;
    const float beta=0;
    const int lda=K;
    const int ldb=K;
    const int ldc=N;
    
    //ptr_matrix_feature = new float[M*N]
    //feat_float = new float[1*N]
    //暴力检索 矩阵运算
    const float *A=ptr_matrix_feature;
    const float *B=feat_float;
    float C[M*1];
        
    cout << "M:"< vec_result;
    for (int i=0; i sort_result = argsort(vec_result);
    vector top_n_result(sort_result.begin(), sort_result.begin() + n_top);

    for_each(top_n_result.begin(), top_n_result.end(),[&](size_t index){ cout << " index: " << index << " value: " << C[index] << " guid: " << np_index_guid_map[index] << endl;});
    
    vector top_n_feature;
    for(auto &index: top_n_result){
      Feature feature;
      feature.setType(FEATURE_SEARCH_RESULT);
      feature.SetGuid(np_index_guid_map[index]);
      feature.SetNpIndex(index);
      feature.SetScore(C[index]);
      top_n_feature.push_back(feature);

      // feature.ShowData();
      // cout << "matrix_feature.row(index):" << matrix_feature.row(index) << endl;
    }
    
    if(nullptr != feat_float){
      delete [] feat_float;
      feat_float = nullptr;
    }
    return top_n_feature;
    //debug_marix_get_max_use();

  }

 

你可能感兴趣的:(c++,代码)