diff options
Diffstat (limited to 'SD-VBS/common/toolbox/MultiNcut/sparsifyc.c')
-rwxr-xr-x | SD-VBS/common/toolbox/MultiNcut/sparsifyc.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/MultiNcut/sparsifyc.c b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.c new file mode 100755 index 0000000..82fca98 --- /dev/null +++ b/SD-VBS/common/toolbox/MultiNcut/sparsifyc.c | |||
@@ -0,0 +1,232 @@ | |||
1 | /*================================================================= | ||
2 | * syntax: SPMX = SPARSIFY(MX, THRES) | ||
3 | * | ||
4 | * SPARSIFY - sparsify the input matrix, i.e. ignore the values | ||
5 | * of the matrix which are below a threshold | ||
6 | * | ||
7 | * Input: - MX: m-by-n matrix (sparse or full) | ||
8 | * - THRES: threshold value (double) | ||
9 | * | ||
10 | * Output: - SPMX: m-by-n sparse matrix only with values | ||
11 | * whose absolut value is above the given threshold | ||
12 | * | ||
13 | * Written by Mirko Visontai (10/24/2003) | ||
14 | *=================================================================*/ | ||
15 | |||
16 | |||
17 | #include <math.h> | ||
18 | #include "mex.h" | ||
19 | |||
20 | void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) | ||
21 | { | ||
22 | /* Declare variable */ | ||
23 | int i,m,n,nzmax,newnnz,col,processed,passed; | ||
24 | int starting_row_index, current_row_index, stopping_row_index; | ||
25 | double *in_pr,*in_pi,*out_pr,*out_pi; | ||
26 | int *in_ir,*in_jc,*out_ir,*out_jc; | ||
27 | double thres; | ||
28 | |||
29 | /* Check for proper number of input and output arguments */ | ||
30 | if ((nlhs != 1) || (nrhs != 2)){ | ||
31 | mexErrMsgTxt("usage: SPMX = SPARSIFY(MX, THRES)."); | ||
32 | } | ||
33 | /* if matrix is complex threshold the norm of the numbers */ | ||
34 | if (mxIsComplex(prhs[0])){ | ||
35 | /* Check data type of input argument */ | ||
36 | if (mxIsSparse(prhs[0])){ | ||
37 | |||
38 | /* read input */ | ||
39 | in_pr = mxGetPr(prhs[0]); | ||
40 | in_pi = mxGetPi(prhs[0]); | ||
41 | in_ir = mxGetIr(prhs[0]); | ||
42 | in_jc = mxGetJc(prhs[0]); | ||
43 | nzmax = mxGetNzmax(prhs[0]); | ||
44 | m = mxGetM(prhs[0]); | ||
45 | n = mxGetN(prhs[0]); | ||
46 | thres = mxGetScalar(prhs[1]); | ||
47 | |||
48 | /* Count new nonzeros */ | ||
49 | newnnz=0; | ||
50 | for(i=0; i<nzmax; i++){ | ||
51 | if (sqrt(in_pr[i]*in_pr[i] + in_pi[i]*in_pi[i])>thres) {newnnz++;} | ||
52 | } | ||
53 | |||
54 | if (newnnz>0){ | ||
55 | /* create output */ | ||
56 | plhs[0] = mxCreateSparse(m,n,newnnz,mxCOMPLEX); | ||
57 | if (plhs[0]==NULL) | ||
58 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
59 | out_pr = mxGetPr(plhs[0]); | ||
60 | out_pi = mxGetPr(plhs[0]); | ||
61 | out_ir = mxGetIr(plhs[0]); | ||
62 | out_jc = mxGetJc(plhs[0]); | ||
63 | passed = 0; | ||
64 | out_jc[0] = 0; | ||
65 | for (col=0; col<n; col++){ | ||
66 | starting_row_index = in_jc[col]; | ||
67 | stopping_row_index = in_jc[col+1]; | ||
68 | out_jc[col+1] = out_jc[col]; | ||
69 | if (starting_row_index == stopping_row_index) | ||
70 | continue; | ||
71 | else { | ||
72 | for (current_row_index = starting_row_index; | ||
73 | current_row_index < stopping_row_index; | ||
74 | current_row_index++) { | ||
75 | if (sqrt(in_pr[current_row_index]*in_pr[current_row_index] + | ||
76 | in_pi[current_row_index]*in_pi[current_row_index] ) > thres){ | ||
77 | |||
78 | out_pr[passed]=in_pr[current_row_index]; | ||
79 | out_pi[passed]=in_pi[current_row_index]; | ||
80 | out_ir[passed]=in_ir[current_row_index]; | ||
81 | out_jc[col+1] = out_jc[col+1]+1; | ||
82 | passed++; | ||
83 | } | ||
84 | } | ||
85 | } | ||
86 | } | ||
87 | } | ||
88 | else{ | ||
89 | plhs[0] = mxCreateSparse(m,n,0,mxCOMPLEX); | ||
90 | } | ||
91 | } | ||
92 | else{ /* for full matrices */ | ||
93 | /* read input */ | ||
94 | in_pr = mxGetPr(prhs[0]); | ||
95 | in_pi = mxGetPr(prhs[0]); | ||
96 | m = mxGetM(prhs[0]); | ||
97 | n = mxGetN(prhs[0]); | ||
98 | thres = mxGetScalar(prhs[1]); | ||
99 | |||
100 | /* Count new nonzeros */ | ||
101 | newnnz=0; | ||
102 | for(i=0; i<m*n; i++){ | ||
103 | if (sqrt(in_pr[i]*in_pr[i] + in_pi[i]*in_pi[i])>thres) {newnnz++;} | ||
104 | } | ||
105 | |||
106 | if (newnnz>0){ | ||
107 | /* create output */ | ||
108 | plhs[0] = mxCreateSparse(m,n,newnnz,mxCOMPLEX); | ||
109 | if (plhs[0]==NULL) | ||
110 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
111 | out_pr = mxGetPr(plhs[0]); | ||
112 | out_pi = mxGetPi(plhs[0]); | ||
113 | out_ir = mxGetIr(plhs[0]); | ||
114 | out_jc = mxGetJc(plhs[0]); | ||
115 | passed = 0; | ||
116 | out_jc[0] = 0; | ||
117 | |||
118 | for (col=0; col<n; col++){ | ||
119 | out_jc[col+1] = out_jc[col]; | ||
120 | for (current_row_index=0; current_row_index<m; current_row_index++){ | ||
121 | if (sqrt(in_pr[current_row_index+m*col]*in_pr[current_row_index+m*col] + | ||
122 | in_pi[current_row_index+m*col]*in_pi[current_row_index+m*col]) > thres){ | ||
123 | |||
124 | out_pr[passed]=in_pr[current_row_index+m*col]; | ||
125 | out_ir[passed]=current_row_index; | ||
126 | out_jc[col+1] = out_jc[col+1]+1; | ||
127 | passed++; | ||
128 | } | ||
129 | } | ||
130 | } | ||
131 | } | ||
132 | else{ | ||
133 | plhs[0] = mxCreateSparse(m,n,0,mxCOMPLEX); | ||
134 | } | ||
135 | } | ||
136 | } | ||
137 | else { | ||
138 | /* Check data type of input argument */ | ||
139 | if (mxIsSparse(prhs[0])){ | ||
140 | |||
141 | /* read input */ | ||
142 | in_pr = mxGetPr(prhs[0]); | ||
143 | in_ir = mxGetIr(prhs[0]); | ||
144 | in_jc = mxGetJc(prhs[0]); | ||
145 | nzmax = mxGetNzmax(prhs[0]); | ||
146 | n = mxGetN(prhs[0]); | ||
147 | m = mxGetM(prhs[0]); | ||
148 | thres = mxGetScalar(prhs[1]); | ||
149 | |||
150 | /* Count new nonzeros */ | ||
151 | newnnz=0; | ||
152 | for(i=0; i<nzmax; i++){ | ||
153 | if ((fabs(in_pr[i]))>thres) {newnnz++;} | ||
154 | } | ||
155 | |||
156 | if (newnnz>0){ | ||
157 | /* create output */ | ||
158 | plhs[0] = mxCreateSparse(m,n,newnnz,mxREAL); | ||
159 | if (plhs[0]==NULL) | ||
160 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
161 | out_pr = mxGetPr(plhs[0]); | ||
162 | out_ir = mxGetIr(plhs[0]); | ||
163 | out_jc = mxGetJc(plhs[0]); | ||
164 | passed = 0; | ||
165 | out_jc[0] = 0; | ||
166 | for (col=0; col<n; col++){ | ||
167 | starting_row_index = in_jc[col]; | ||
168 | stopping_row_index = in_jc[col+1]; | ||
169 | out_jc[col+1] = out_jc[col]; | ||
170 | if (starting_row_index == stopping_row_index) | ||
171 | continue; | ||
172 | else { | ||
173 | for (current_row_index = starting_row_index; | ||
174 | current_row_index < stopping_row_index; | ||
175 | current_row_index++) { | ||
176 | if (fabs(in_pr[current_row_index])>thres){ | ||
177 | out_pr[passed]=in_pr[current_row_index]; | ||
178 | out_ir[passed]=in_ir[current_row_index]; | ||
179 | out_jc[col+1] = out_jc[col+1]+1; | ||
180 | passed++; | ||
181 | } | ||
182 | } | ||
183 | } | ||
184 | } | ||
185 | } | ||
186 | else{ | ||
187 | plhs[0] = mxCreateSparse(m,n,0,mxREAL); | ||
188 | } | ||
189 | } | ||
190 | else{ /* for full matrices */ | ||
191 | /* read input */ | ||
192 | in_pr = mxGetPr(prhs[0]); | ||
193 | n = mxGetN(prhs[0]); | ||
194 | m = mxGetM(prhs[0]); | ||
195 | thres = mxGetScalar(prhs[1]); | ||
196 | |||
197 | /* Count new nonzeros */ | ||
198 | newnnz=0; | ||
199 | for(i=0; i<m*n; i++){ | ||
200 | if ((fabs(in_pr[i]))>thres) {newnnz++;} | ||
201 | } | ||
202 | |||
203 | if (newnnz>0){ | ||
204 | /* create output */ | ||
205 | plhs[0] = mxCreateSparse(m,n,newnnz,mxREAL); | ||
206 | if (plhs[0]==NULL) | ||
207 | mexErrMsgTxt("Could not allocate enough memory!\n"); | ||
208 | out_pr = mxGetPr(plhs[0]); | ||
209 | out_ir = mxGetIr(plhs[0]); | ||
210 | out_jc = mxGetJc(plhs[0]); | ||
211 | passed = 0; | ||
212 | out_jc[0] = 0; | ||
213 | |||
214 | for (col=0; col<n; col++){ | ||
215 | out_jc[col+1] = out_jc[col]; | ||
216 | for (current_row_index=0; current_row_index<m; current_row_index++){ | ||
217 | if (fabs(in_pr[current_row_index+m*col])>thres){ | ||
218 | out_pr[passed]=in_pr[current_row_index+m*col]; | ||
219 | out_ir[passed]=current_row_index; | ||
220 | out_jc[col+1] = out_jc[col+1]+1; | ||
221 | passed++; | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | } | ||
226 | else{ | ||
227 | plhs[0] = mxCreateSparse(m,n,0,mxREAL); | ||
228 | } | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | |||