Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- __device__
- double gaussian_distribution(int dim,float data[], double mean[], double diagonal_covariance[]){
- double determinant = 1;
- double result;
- double sum = 0;
- for (int i = 0; i < dim; i++){
- determinant *= diagonal_covariance[i];
- sum += (data[i] - mean[i]) * (1 / diagonal_covariance[i]) * (data[i] - mean[i]);
- }
- result = 1.0 / (pow(2 * 3.1415926535897931, dim / 2.0) * sqrt(determinant)) * exp(-0.5 * sum);
- return result;
- }
- __global__ void classifica(float *data, int N, int dim, int components,uchar* res, double **mean, double**covariance, double *weight, int road_index){
- int id=blockIdx.x*blockDim.x+threadIdx.x;
- //if(id>N) return;
- double max=-1;
- int classe;
- for(int i=0;i<components;i++){
- double gauss=gaussian_distribution(dim,data+id, mean[id],covariance[id] );
- double likelihood = weight[i] * gauss;
- if(max<likelihood){
- classe=i;
- max=likelihood;
- }
- }
- if(classe==road_index)
- res[id]=0;
- else
- res[id]=255;
- }
- void Gaussian_Mixture_Model::Classify(float *data, int N, uchar *res, int road_index){
- uchar *tmp;
- int n_blocks=N/256;
- int dim_blocks=256;
- auto t1=chrono::high_resolution_clock::now();
- cudaMalloc(&tmp, N*sizeof(uchar));
- classifica<<<n_blocks,dim_blocks>>>(data, N, dimension_data,number_gaussian_components, tmp, this->mean, this->diagonal_covariance, this->weight, road_index);
- cudaMemcpy(res, tmp, N*sizeof(uchar),cudaMemcpyDeviceToHost);
- cout<<"tempo classifica: "<<chrono::duration_cast<chrono::nanoseconds>(chrono::high_resolution_clock::now()-t1).count()<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement