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

📄 sparsifyc.c

📁 对图像分割归一化算法进行编程
💻 C
字号:
/*=================================================================* syntax: SPMX = SPARSIFY(MX, THRES)** SPARSIFY  - sparsify the input matrix, i.e. ignore the values * 			of the matrix which	are below a threshold* 			* 			Input: 	- MX: m-by-n matrix (sparse or full)* 					- THRES: threshold value (double)** 			Output: - SPMX: m-by-n sparse matrix only with values * 					whose absolut value is above the given threshold** 			Written by Mirko Visontai (10/24/2003)*=================================================================*/#include <math.h>#include "mex.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){    /* Declare variable */    int i,m,n,nzmax,newnnz,col,processed,passed;	int starting_row_index, current_row_index, stopping_row_index;    double *in_pr,*in_pi,*out_pr,*out_pi;    int *in_ir,*in_jc,*out_ir,*out_jc;   	double thres;    /* Check for proper number of input and output arguments */        if ((nlhs != 1) || (nrhs != 2)){		mexErrMsgTxt("usage: SPMX = SPARSIFY(MX, THRES).");    } 	/* if matrix is complex threshold the norm of the numbers */	if (mxIsComplex(prhs[0])){		/* Check data type of input argument  */		if (mxIsSparse(prhs[0])){			/* read input */			in_pr  	= mxGetPr(prhs[0]);			in_pi  	= mxGetPi(prhs[0]);			in_ir	= mxGetIr(prhs[0]);			in_jc	= mxGetJc(prhs[0]);			nzmax 	= mxGetNzmax(prhs[0]);			m		= mxGetM(prhs[0]);			n		= mxGetN(prhs[0]);			thres 	= mxGetScalar(prhs[1]);			/* Count new nonzeros */			newnnz=0;			for(i=0; i<nzmax; i++){				if (sqrt(in_pr[i]*in_pr[i] + in_pi[i]*in_pi[i])>thres) {newnnz++;}			}			if (newnnz>0){				/* create output */				plhs[0] 	= mxCreateSparse(m,n,newnnz,mxCOMPLEX);				if (plhs[0]==NULL)					mexErrMsgTxt("Could not allocate enough memory!\n");				out_pr 		= mxGetPr(plhs[0]);				out_pi 		= mxGetPr(plhs[0]);				out_ir 		= mxGetIr(plhs[0]);				out_jc 		= mxGetJc(plhs[0]);				passed		= 0;				out_jc[0]	= 0;				for (col=0; col<n; col++){					starting_row_index = in_jc[col];					stopping_row_index = in_jc[col+1];					out_jc[col+1] = out_jc[col];					if (starting_row_index == stopping_row_index)						continue;					else {						for (current_row_index = starting_row_index;							current_row_index < stopping_row_index;							current_row_index++)  {								if (sqrt(in_pr[current_row_index]*in_pr[current_row_index] + 									     in_pi[current_row_index]*in_pi[current_row_index] ) > thres){									out_pr[passed]=in_pr[current_row_index];										out_pi[passed]=in_pi[current_row_index];										out_ir[passed]=in_ir[current_row_index];										out_jc[col+1] = out_jc[col+1]+1;									passed++;								}						}					}				}			}			else{				plhs[0] = mxCreateSparse(m,n,0,mxCOMPLEX);			}		}		else{ /* for full matrices */			/* read input */			in_pr  	= mxGetPr(prhs[0]);			in_pi  	= mxGetPr(prhs[0]);			m		= mxGetM(prhs[0]);			n		= mxGetN(prhs[0]);			thres 	= mxGetScalar(prhs[1]);			/* Count new nonzeros */			newnnz=0;			for(i=0; i<m*n; i++){				if (sqrt(in_pr[i]*in_pr[i] + in_pi[i]*in_pi[i])>thres) {newnnz++;}			}			if (newnnz>0){				/* create output */				plhs[0]	 	= mxCreateSparse(m,n,newnnz,mxCOMPLEX);				if (plhs[0]==NULL)					mexErrMsgTxt("Could not allocate enough memory!\n");				out_pr 		= mxGetPr(plhs[0]);				out_pi 		= mxGetPi(plhs[0]);				out_ir 		= mxGetIr(plhs[0]);				out_jc 		= mxGetJc(plhs[0]);				passed		= 0;				out_jc[0] 	= 0;				for (col=0; col<n; col++){					out_jc[col+1] = out_jc[col];					for (current_row_index=0; current_row_index<m; current_row_index++){							if (sqrt(in_pr[current_row_index+m*col]*in_pr[current_row_index+m*col] +									 in_pi[current_row_index+m*col]*in_pi[current_row_index+m*col]) > thres){																out_pr[passed]=in_pr[current_row_index+m*col];									out_ir[passed]=current_row_index;									out_jc[col+1] = out_jc[col+1]+1;								passed++;							}					}				}			}			else{				plhs[0] = mxCreateSparse(m,n,0,mxCOMPLEX);			}		}	}	else {     	/* Check data type of input argument  */    	if (mxIsSparse(prhs[0])){			/* read input */   			in_pr  	= mxGetPr(prhs[0]);   			in_ir	= mxGetIr(prhs[0]);    		in_jc	= mxGetJc(prhs[0]);	   		nzmax 	= mxGetNzmax(prhs[0]);			n		= mxGetN(prhs[0]);			m		= mxGetM(prhs[0]);			thres 	= mxGetScalar(prhs[1]);	  		/* Count new nonzeros */			newnnz=0;			for(i=0; i<nzmax; i++){				if ((fabs(in_pr[i]))>thres) {newnnz++;}			}			if (newnnz>0){				/* create output */	   	 		plhs[0] 	= mxCreateSparse(m,n,newnnz,mxREAL);				if (plhs[0]==NULL)					mexErrMsgTxt("Could not allocate enough memory!\n");   	 			out_pr 		= mxGetPr(plhs[0]);    			out_ir 		= mxGetIr(plhs[0]);    			out_jc 		= mxGetJc(plhs[0]);				passed		= 0;				out_jc[0]	= 0;				for (col=0; col<n; col++){					starting_row_index = in_jc[col];					stopping_row_index = in_jc[col+1];					out_jc[col+1] = out_jc[col];					if (starting_row_index == stopping_row_index)						continue;					else {						for (current_row_index = starting_row_index;							current_row_index < stopping_row_index;							current_row_index++)  {								if (fabs(in_pr[current_row_index])>thres){									out_pr[passed]=in_pr[current_row_index];										out_ir[passed]=in_ir[current_row_index];										out_jc[col+1] = out_jc[col+1]+1;									passed++;								}						}					}				}			}			else{    			plhs[0] = mxCreateSparse(m,n,0,mxREAL);			}		}		else{ /* for full matrices */			/* read input */   			in_pr  	= mxGetPr(prhs[0]);			n		= mxGetN(prhs[0]);			m		= mxGetM(prhs[0]);			thres 	= mxGetScalar(prhs[1]);	  		/* Count new nonzeros */			newnnz=0;			for(i=0; i<m*n; i++){				if ((fabs(in_pr[i]))>thres) {newnnz++;}			}			if (newnnz>0){				/* create output */	   	 		plhs[0]	 	= mxCreateSparse(m,n,newnnz,mxREAL);				if (plhs[0]==NULL)					mexErrMsgTxt("Could not allocate enough memory!\n");   	 			out_pr 		= mxGetPr(plhs[0]);    			out_ir 		= mxGetIr(plhs[0]);    			out_jc 		= mxGetJc(plhs[0]);				passed		= 0;    			out_jc[0] 	= 0;				for (col=0; col<n; col++){					out_jc[col+1] = out_jc[col];					for (current_row_index=0; current_row_index<m; current_row_index++){							if (fabs(in_pr[current_row_index+m*col])>thres){								out_pr[passed]=in_pr[current_row_index+m*col];									out_ir[passed]=current_row_index;									out_jc[col+1] = out_jc[col+1]+1;								passed++;							}					}				}			}			else{    			plhs[0] = mxCreateSparse(m,n,0,mxREAL);			}		}	}} 

⌨️ 快捷键说明

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