summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c
diff options
context:
space:
mode:
Diffstat (limited to 'SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c')
-rwxr-xr-xSD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c405
1 files changed, 405 insertions, 0 deletions
diff --git a/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c
new file mode 100755
index 0000000..25def92
--- /dev/null
+++ b/SD-VBS/common/toolbox/MultiNcut/a_times_b_cmplx.c
@@ -0,0 +1,405 @@
1/*================================================================
2a_times_b_cmplx.c = used by a couple of mex functions
3provide Matrix vector multiplications,
4and solve triangular systems
5(sparse matrix and full vector)
6
7CSC_CmplxVecMult_CAB_double, CSR_CmplxVecMult_CAB_double,
8CSCsymm_CmplxVecMult_CAB_double added by Mirko Visontai (10/24/2003)
9
10*=================================================================*/
11# include "math.h"
12
13
14/*C<-a*A*B+C*/
15void CSC_VecMult_CaABC_double(
16 const int m, const int k, const double alpha,
17 const double *val, const int *indx,
18 const int *pntrb,
19 const double *b,
20 double *c)
21{
22 int i,j,jb,je;
23
24 for (i=0;i!=k;i++){
25 jb = pntrb[i];
26 je = pntrb[i+1];
27 for (j=jb;j!=je;j++)
28 c[indx[j]] += alpha * b[i] * val[j];
29 }
30}
31
32/*C<-a*A'*B+C*/
33void CSR_VecMult_CaABC_double(
34 const int k, const int m, const double alpha,
35 const double *val, const int *indx,
36 const int *pntrb,
37 const double *b,
38 double *c)
39{
40 double t;
41 const double *pval;
42 int i,j,jb,je;
43
44 pval = val;
45 for (i=0;i!=m;i++) {
46 t = 0;
47 jb = pntrb[i];
48 je = pntrb[i+1];
49 for (j=jb;j!=je;j++)
50 t += alpha * b[indx[j]] * (*pval++);
51 c[i] += t;
52 }
53}
54
55
56/*C<-A*b */
57void CSC_VecMult_CAB_double(
58 const int m, const int k, /*nb_rows, nb_columns*/
59 const double *val, const int *indx,
60 const int *pntrb,
61 const double *b,
62 double *c
63 )
64{
65 int i,j,jb,je;
66 double *pc=c;
67 for (i=0;i!=m;i++) *pc++ = 0;
68
69 for (i=0;i!=k;i++){
70 jb = pntrb[i];
71 je = pntrb[i+1];
72 for (j=jb;j!=je;j++)
73 c[indx[j]] += b[i] * val[j];
74 }
75}
76
77/*C<-A*b (complex)*/
78void CSC_CmplxVecMult_CAB_double(
79 const int m, const int k,
80 const double *valr, const double *vali,
81 const int *indx,
82 const int *pntrb,
83 const double *br, const double *bi,
84 double *cr, double *ci
85 )
86{
87 int i,j,jb,je;
88 double *pcr=cr;
89 double *pci=ci;
90 for (i=0;i!=m;i++){
91 *pcr++ = 0.0;
92 *pci++ = 0.0;
93 }
94
95 for (i=0;i!=k;i++){
96 jb = pntrb[i];
97 je = pntrb[i+1];
98 for (j=jb;j!=je;j++){
99 cr[indx[j]] += (br[i] * valr[j]) - (bi[i] * vali[j]);
100 ci[indx[j]] += (br[i] * vali[j]) + (bi[i] * valr[j]);
101 }
102 }
103}
104
105/*C<-A'*b
106 plus rapide que CSC_VecMult_CAB_double */
107void CSR_VecMult_CAB_double(
108 const int k, const int m,
109 const double *val, const int *indx,
110 const int *pntrb,
111 const double *b,
112 double *c
113 )
114{
115 double t;
116 const double *pval;
117 double *pc=c;
118 int i,j,jb,je;
119
120 for (i=0;i!=m;i++) *pc++ = 0;
121
122 pval = val;
123 for (i=0;i!=m;i++) {
124 t = 0;
125 jb = pntrb[i];
126 je = pntrb[i+1];
127 for (j=jb;j!=je;j++)
128 t += b[indx[j]] * (*pval++);
129 c[i] += t;
130 }
131}
132
133/*C<-A'*b (complex)
134 plus rapide que CSC_VecMult_CAB_double */
135void CSR_CmplxVecMult_CAB_double(
136 const int k, const int m,
137 const double *valr, const double *vali,
138 const int *indx,
139 const int *pntrb,
140 const double *br, const double *bi,
141 double *cr, double *ci
142 )
143{
144 double tr, ti;
145 const double *pvalr;
146 const double *pvali;
147 double *pcr=cr;
148 double *pci=ci;
149 int i,j,jb,je;
150
151 for (i=0;i!=m;i++){
152 *pcr++ = 0.0;
153 *pci++ = 0.0;
154 }
155
156 pvalr = valr;
157 pvali = vali;
158 for (i=0;i!=m;i++) {
159 tr = 0.0;
160 ti = 0.0;
161 jb = pntrb[i];
162 je = pntrb[i+1];
163 for (j=jb;j!=je;j++){
164 tr += (br[indx[j]] * (*pvalr)) - (bi[indx[j]] * (*pvali));
165 ti += (br[indx[j]] * (*pvali++)) + (bi[indx[j]] * (*pvalr++));
166 }
167 cr[i] += tr;
168 ci[i] += ti;
169 }
170}
171
172
173
174/* C<-A*b (A is symmetric) */
175void CSRsymm_VecMult_CAB_double(
176 const int k, const int m,
177 const double *val, const int *indx,
178 const int *pntrb,
179 const double *b,
180 double *c
181 )
182{
183 const double *pval;
184 double *pc=c;
185 int i,j;
186 int jj;
187 int rpntrb, rpntre;
188 int index, nvals;
189
190
191 for (i=0;i!=m;i++) *pc++ = 0;
192 pval = val;
193 for (j=0;j!=k;j++){
194 rpntrb = pntrb[j];
195 rpntre = pntrb[j+1];
196 for (jj=rpntrb;jj!=rpntre;jj++) {
197 index = indx[jj];
198 if ( index == j ) {
199 c[j] += b[j] * (*pval++);
200 continue;
201 }
202 if ( index > j ) {
203 c[index] += b[j] * (*pval);
204
205 c[j] += b[index] * (*pval++);
206 }
207 else {
208 pval++;
209 }
210 }
211 }
212}
213
214
215/* C<-A*b (A is symmetric and complex) */
216void CSRsymm_CmplxVecMult_CAB_double(
217 const int k, const int m,
218 const double *valr, const double *vali,
219 const int *indx,
220 const int *pntrb,
221 const double *br, const double *bi,
222 double *cr, double *ci
223 )
224{
225 const double *pvalr, *pvali;
226 double *pcr=cr;
227 double *pci=ci;
228 int i,j;
229 int jj;
230 int rpntrb, rpntre;
231 int index, nvals;
232
233
234 for (i=0;i!=m;i++){
235 *pcr++ = 0.0;
236 *pci++ = 0.0;
237 }
238
239 pvalr = valr;
240 pvali = vali;
241 for (j=0;j!=k;j++){
242 rpntrb = pntrb[j];
243 rpntre = pntrb[j+1];
244 for (jj=rpntrb;jj!=rpntre;jj++) {
245 index = indx[jj];
246 if ( index == j ) {
247 cr[j] += (br[j] * (*pvalr)) - (bi[j] * (*pvali));
248 ci[j] += (br[j] * (*pvali++)) + (bi[j] * (*pvalr++));
249 continue;
250 }
251 if ( index > j ) {
252 cr[index] += (br[j] * (*pvalr)) - (bi[j] * (*pvali));
253 ci[index] += (br[j] * (*pvali)) + (bi[j] * (*pvalr));
254
255 cr[j] += (br[index] * (*pvalr)) - (bi[index] * (*pvali));
256 ci[j] += (br[index] * (*pvali++)) + (bi[index] * (*pvalr++));
257 }
258 else {
259 pvalr++;
260 pvali++;
261 }
262
263 }
264 }
265}
266
267
268/*C<-A\B; with Lower triangular A*/
269void CSC_VecTriangSlvLD_CAB_double(
270 const int m,
271 const double *val,
272 const int *indx, const int *pntrb,
273 const double *b,
274 double *c)
275{
276 int i, j, jb, je;
277 double *pc=c;
278 double z;
279
280 for (i=0;i!=m;i++){
281 *pc = b[i];
282 pc++;
283 }
284
285 pc=c;
286 for (i=0;i!=m;i++) {
287 jb = pntrb[i];
288 je = pntrb[i+1];
289 z = pc[i] / val[jb];
290 pc[i] = z;
291 for (j=jb+1;j<je;j++) {
292 c[indx[j]] -= z*val[j];
293 }
294 }
295}
296
297/*C<-A\B; with Upper triangular A*/
298void CSC_VecTriangSlvUD_CAB_double(
299 const int m,
300 const double *val,
301 const int *indx, const int *pntrb,
302 const double *b,
303 double *c)
304{
305 int i, j, jb, je, index;
306 double *pc=c;
307 double z;
308
309 for (i=0;i!=m;i++){
310 *pc = b[i];
311 pc++;
312 }
313
314 pc=c;
315 for (i=m-1;i!=-1;i--) {
316 jb = pntrb[i];
317 je = pntrb[i+1]-1;
318 z = pc[i] /val[je];
319 pc[i] = z;
320 for (j=jb;j<je;j++) {
321 c[indx[j]] -= z * val[j];
322 }
323 }
324}
325/*C<-A'\B; where A is upper (little slower than CSC)*/
326void CSR_VecTriangSlvLD_CAB_double(
327 const int m,
328 const double *val,
329 const int *indx, const int *pntrb,
330 const double *b,
331 double *c)
332{
333 int i, j, jb, je, index;
334 double *pc=c;
335 double z;
336 double valtmp;
337
338 pc=c;
339 for (i=0;i!=m;i++) {
340 z = 0;
341 jb = pntrb[i];
342 je = pntrb[i+1];
343 for (j=jb;j<je;j++) {
344 index = indx[j];
345 if ( index == i ) {
346 valtmp = val[j];
347 } else {
348 z += c[index] * val[j];
349 }
350 }
351 pc[i] = (b[i] - z) / valtmp;
352 }
353}
354
355/*C<-A'\B; where A is lower (little slower than CSC)*/
356void CSR_VecTriangSlvUD_CAB_double(
357 const int m,
358 const double *val,
359 const int *indx, const int *pntrb,
360 const double *b,
361 double *c)
362{
363 int i, j, jb, je, index;
364 double *pc=c;
365 double valtmp;
366 double z;
367
368 pc=c;
369 for (i=m-1;i!=-1; i--) {
370 z = 0;
371 jb = pntrb[i];
372 je = pntrb[i+1];
373 for (j=jb+1; j<je; j++) {
374 z += c[indx[j]] * val[j];
375 }
376 pc[i] = (b[i] - z) / val[jb];
377 }
378}
379
380/*C<-A*B, where A is (m,k) and B is (k,n)*/
381void CSC_MatMult_CAB_double(
382 const int m, const int n, const int k,
383 const double *val, const int *indx,
384 const int *pntrb,
385 const double *b, const int ldb,
386 double *c, const int ldc)
387{
388 int i,j,jb,je;
389 double *pc=c;
390 int l;
391
392 for (l=0;l!=n;l++)
393 for (i=0;i!=m;i++) *pc++ = 0;
394
395 for (l=0;l!=n;l++) {
396 for (i=0;i!=k;i++){
397 jb = pntrb[i];
398 je = pntrb[i+1];
399 for (j=jb;j!=je;j++)
400 c[indx[j]] += b[i] * val[j];
401 }
402 /*c += ldc; b += ldb; */
403 c += m; b += m;
404 }
405}