int RandFourierFactorize(int nKernelType, int nKernelRank, float fGamma, const std::vector<fvec>& X, std::vector<fvec> &G, std::vector<fvec> &W, fvec &b) { int nErrCode = 0; int m = X.size(); if(m == 0) { return nErrCode; } int dim = X[0].size(); G.clear(); W.clear(); b.clear(); //generate random features dlib::rand r; std::ostringstream seed; seed << (unsigned int) time(0); r.set_seed(seed.str()); switch(nKernelType) { case RAND_KERNEL_RBF: for(int ind = 0; ind < dim; ++ind) { fvec tmp_vec; for(int rank_idx = 0; rank_idx < nKernelRank; ++rank_idx) { tmp_vec.push_back(r.get_random_gaussian() * fGamma); } W.push_back(tmp_vec); } for(int ind = 0; ind < nKernelRank; ++ind) { b.push_back(r.get_random_float() * 2.0 * PI); } for(int ind = 0; ind < m; ++ind) { fvec tmp_vec; RandFourierMap(nKernelType, X[ind], W, b, tmp_vec); G.push_back(tmp_vec); } break; default: //unknown kernel type //printf("unknown type\n"); nErrCode = 1; break; }; return nErrCode; }