Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/matc/src/oper.c
3196 views
1
/*****************************************************************************
2
*
3
* Elmer, A Finite Element Software for Multiphysical Problems
4
*
5
* Copyright 1st April 1995 - , CSC - IT Center for Science Ltd., Finland
6
*
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library (in file ../LGPL-2.1); if not, write
19
* to the Free Software Foundation, Inc., 51 Franklin Street,
20
* Fifth Floor, Boston, MA 02110-1301 USA
21
*
22
*****************************************************************************/
23
24
/*******************************************************************************
25
*
26
* MATC operator routines.
27
*
28
*******************************************************************************
29
*
30
* Author: Juha Ruokolainen
31
*
32
* Address: CSC - IT Center for Science Ltd.
33
* Keilaranta 14, P.O. BOX 405
34
* 02101 Espoo, Finland
35
* Tel. +358 0 457 2723
36
* Telefax: +358 0 457 2302
37
* EMail: [email protected]
38
*
39
* Date: 30 May 1996
40
*
41
* Modified by:
42
*
43
* Date of modification:
44
*
45
******************************************************************************/
46
/***********************************************************************
47
|
48
| Oper.C - Last Edited 15. 8. 1988
49
|
50
***********************************************************************/
51
52
/*======================================================================
53
|Syntax of the manual pages:
54
|
55
|FUNCTION NAME(...) params ...
56
|
57
$ usage of the function and type of the parameters
58
? explain the effects of the function
59
= return value and the type of value if not of type int
60
@ globals effected directly by this routine
61
! current known bugs or limitations
62
& functions called by this function
63
~ these functions may interest you as an alternative function or
64
| because they control this function somehow
65
=====================================================================*/
66
67
68
/*
69
* $Id: oper.c,v 1.1.1.1 2005/04/14 13:29:14 vierinen Exp $
70
*
71
* $Log: oper.c,v $
72
* Revision 1.1.1.1 2005/04/14 13:29:14 vierinen
73
* initial matc automake package
74
*
75
* Revision 1.2 1998/08/01 12:34:51 jpr
76
*
77
* Added Id, started Log.
78
*
79
*
80
*/
81
82
#include "elmer/matc.h"
83
84
#ifdef TYPE
85
#undef TYPE
86
#endif
87
#ifdef NROW
88
#undef NROW
89
#endif
90
#ifdef NCOL
91
#undef NCOL
92
#endif
93
#ifdef MATR
94
#undef MATR
95
#endif
96
#ifdef M
97
#undef M
98
#endif
99
#ifdef MATSIZE
100
#undef MATSIZE
101
#endif
102
103
#define TYPE(mat) (mat)->type
104
#define NROW(mat) (mat)->nrow
105
#define NCOL(mat) (mat)->ncol
106
#define MATR(mat) (mat)->data
107
#define MATSIZE(mat) (NROW(mat) * NCOL(mat) * sizeof(double))
108
109
#define MA(i,j) a[ncola * (i) + (j)]
110
#define MB(i,j) b[ncolb * (i) + (j)]
111
#define MC(i,j) c[ncolc * (i) + (j)]
112
113
MATRIX *mat_new(int type, int nrow, int ncol)
114
{
115
MATRIX *res;
116
117
res = (MATRIX *)ALLOCMEM(MATRIXSIZE);
118
TYPE(res) = type;
119
NROW(res) = nrow;
120
NCOL(res) = ncol;
121
MATR(res) = (double *)ALLOCMEM(MATSIZE(res));
122
123
return res;
124
}
125
126
MATRIX *mat_copy(MATRIX *mat)
127
{
128
MATRIX *res;
129
130
if (mat == (MATRIX *)NULL) return NULL;
131
132
res = mat_new(TYPE(mat), NROW(mat), NCOL(mat));
133
memcpy((char *)MATR(res), (char *)MATR(mat), MATSIZE(mat));
134
135
return res;
136
}
137
138
void mat_free(MATRIX *mat)
139
{
140
if (mat == (MATRIX *)NULL) return;
141
142
FREEMEM((char *)MATR(mat));
143
FREEMEM((char *)mat);
144
}
145
146
MATRIX *opr_vector(MATRIX *A, MATRIX *B)
147
{
148
MATRIX *C;
149
150
int i, n, inc;
151
152
double *a = MATR(A), *b = MATR(B), *c;
153
154
inc = ((int)*b > (int)*a) ? 1:(-1);
155
n = abs((int)*b - (int)*a) + 1;
156
157
C = mat_new(TYPE_DOUBLE, 1, n);
158
c = MATR(C);
159
160
for(i = 0; i < n; i++)
161
*c++ = (int)*a + i*inc;
162
163
return C;
164
}
165
166
MATRIX *opr_resize(MATRIX *A, MATRIX *B)
167
{
168
MATRIX *C;
169
170
double *a = MATR(A), *b = MATR(B), *c;
171
int i, j, n, m;
172
173
if (NCOL(B) >= 2)
174
{
175
i = *b++; j = *b++;
176
}
177
else
178
{
179
i = 1; j = *b;
180
}
181
182
if (i < 1 || j < 1)
183
error("resize: invalid size for and array");
184
185
C = mat_new(TYPE(A), i, j);
186
c = MATR(C);
187
188
n = i * j; m = NROW(A) * NCOL(A);
189
190
for(i = j = 0; i < n; i++)
191
{
192
*c++ = a[j++];
193
if (j == m) j = 0;
194
}
195
196
return C;
197
}
198
199
MATRIX *opr_apply(MATRIX *A)
200
{
201
VARIABLE *store, *ptr;
202
MATRIX *C = NULL;
203
204
store = var_temp_new(TYPE_STRING, NROW(A), NCOL(A));
205
REFCNT(store) = 0;
206
mat_free(store->this);
207
store->this = A;
208
REFCNT(store)++;
209
210
ptr = (VARIABLE *)com_apply(store);
211
212
var_delete_temp(store);
213
214
if ( ptr ) C = mat_copy(ptr->this);
215
216
return C;
217
}
218
219
MATRIX *opr_add(MATRIX *A, MATRIX *B)
220
{
221
MATRIX *C;
222
223
int i;
224
225
int nrowa = NROW(A), ncola = NCOL(A);
226
int nrowb = NROW(B), ncolb = NCOL(B);
227
228
double *a = MATR(A), *b = MATR(B), *c;
229
230
double value;
231
232
if (nrowa == nrowb && ncola == ncolb)
233
{
234
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
235
nrowa *= ncola;
236
for(i = 0; i < nrowa; i++) *c++ = *a++ + *b++;
237
}
238
239
else if (nrowa == 1 && ncola == 1)
240
{
241
C = mat_new(TYPE(B), nrowb, ncolb); c = MATR(C);
242
value = *a; nrowb *= ncolb;
243
for(i = 0; i < nrowb; i++) *c++ = value + *b++;
244
}
245
246
else if (nrowb == 1 && ncolb == 1)
247
{
248
C = mat_new(TYPE(A), nrowa, ncola); c = MATR(C);
249
value = *b; nrowa *= ncola;
250
for(i = 0; i < nrowa; i++) *c++ = value + *a++;
251
}
252
253
else
254
error("Add: Incompatible for addition.\n");
255
256
return C;
257
}
258
259
MATRIX *opr_minus(MATRIX *A)
260
{
261
MATRIX *C;
262
int i;
263
264
int nrowa = NROW(A), ncola = NCOL(A);
265
266
double *a = MATR(A), *c;
267
268
C = mat_new(TYPE(A), nrowa, ncola); c = MATR(C);
269
270
nrowa *= ncola;
271
for(i = 0; i < nrowa; i++) *c++ = -*a++;
272
273
return C;
274
}
275
276
MATRIX *opr_subs(MATRIX *A, MATRIX *B)
277
{
278
MATRIX *C;
279
280
double value;
281
282
int i;
283
284
int nrowa = NROW(A), ncola = NCOL(A);
285
int nrowb = NROW(B), ncolb = NCOL(B);
286
287
double *a = MATR(A), *b = MATR(B), *c;
288
289
if (nrowa == nrowb && ncola == ncolb)
290
{
291
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
292
nrowa *= ncola;
293
for(i = 0; i < nrowa; i++) *c++ = *a++ - *b++;
294
}
295
else if (nrowa == 1 && ncola == 1)
296
{
297
C = mat_new(TYPE(B),nrowb, ncolb); c = MATR(C);
298
value = *a; nrowb *= ncolb;
299
for(i = 0; i < nrowb; i++) *c++ = value - *b++;
300
}
301
else if (nrowb == 1 && ncolb == 1)
302
{
303
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
304
value = *b; nrowa *= ncola;
305
for(i = 0; i < nrowa; i++) *c++ = *a++ - value;
306
}
307
else
308
error("Substr: Incompatible for addition.\n");
309
310
return C;
311
}
312
313
MATRIX *opr_mul(MATRIX *A, MATRIX *B)
314
{
315
MATRIX *C;
316
317
double value,s;
318
int i, j, k;
319
320
int nrowa = NROW(A), ncola = NCOL(A);
321
int nrowb = NROW(B), ncolb = NCOL(B);
322
323
double *a = MATR(A), *b = MATR(B), *c;
324
325
if (nrowa == 1 && ncola == 1)
326
{
327
C = mat_new(TYPE(B), nrowb, ncolb); c = MATR(C);
328
value = *a; nrowb *= ncolb;
329
for(i = 0; i < nrowb; i++) *c++ = value * *b++;
330
}
331
else if (nrowb == 1 && ncolb == 1)
332
{
333
C = mat_new(TYPE(A), nrowa, ncola); c = MATR(C);
334
value = *b; nrowa *= ncola;
335
for(i = 0; i < nrowa; i++) *c++ = value * *a++;
336
}
337
else if (ncola == nrowb)
338
{
339
C = mat_new(TYPE(A), nrowa,ncolb);
340
c = MATR(C);
341
for(i = 0; i < nrowa; i++)
342
{
343
for(j = 0; j < ncolb; j++)
344
{
345
s = 0;
346
for(k = 0; k < ncola; k++) s += a[k] * MB(k,j);
347
*c++ = s;
348
}
349
a += ncola;
350
}
351
}
352
else if ( ncola == ncolb && nrowa == nrowb )
353
{
354
C = mat_new(TYPE(A), nrowa,ncolb);
355
c = MATR(C);
356
k = 0;
357
for( i = 0; i < nrowa; i++ )
358
for( j = 0; j < ncolb; j++,k++ ) c[k] = a[k] * b[k];
359
}
360
else
361
{
362
error("Mul: Incompatible for multiplication.\n");
363
}
364
365
return C;
366
}
367
368
MATRIX *opr_pmul(MATRIX *A, MATRIX *B)
369
{
370
MATRIX *C;
371
372
double value;
373
int i;
374
375
int nrowa = NROW(A), ncola = NCOL(A);
376
int nrowb = NROW(B), ncolb = NCOL(B);
377
378
double *a = MATR(A), *b = MATR(B), *c;
379
380
if (nrowa == nrowb && ncola == ncolb)
381
{
382
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
383
nrowa *= ncola;
384
for(i = 0; i < nrowa; i++) *c++ = *a++ * *b++;
385
}
386
else if (nrowa == 1 && ncola == 1)
387
{
388
C = mat_new(TYPE(B), nrowb, ncolb); c = MATR(C);
389
value = *a; nrowb *= ncolb;
390
for(i = 0; i < nrowb; i++) *c++ = value * *b++;
391
}
392
else if (nrowb == 1 && ncolb == 1)
393
{
394
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
395
value = *b; nrowa *= ncola;
396
for(i = 0; i < nrowa; i++) *c++ = *a++ * value;
397
}
398
else
399
error("PMul: Incompatible for pointwise multiplication.\n");
400
401
return C;
402
}
403
404
MATRIX *opr_div(MATRIX *A, MATRIX *B)
405
{
406
MATRIX *C;
407
408
double value;
409
int i;
410
411
int nrowa = NROW(A), ncola = NCOL(A);
412
int nrowb = NROW(B), ncolb = NCOL(B);
413
414
double *a = MATR(A), *b = MATR(B), *c;
415
416
if (nrowa == nrowb && ncola == ncolb)
417
{
418
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
419
nrowa *= ncola;
420
for(i = 0; i < nrowa; i++) *c++ = *a++ / *b++;
421
}
422
else if (nrowa == 1 && ncola == 1)
423
{
424
C = mat_new(TYPE(B), nrowb, ncolb); c = MATR(C);
425
value = *a; nrowb *= ncolb;
426
for(i = 0; i < nrowb; i++) *c++ = value / *b++;
427
}
428
else if (nrowb == 1 && ncolb == 1)
429
{
430
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
431
value = *b; nrowa *= ncola;
432
for(i = 0; i < nrowa; i++) *c++ = *a++ / value;
433
}
434
else
435
error("Div: Incompatible for division.\n");
436
437
return C;
438
}
439
440
MATRIX *opr_pow(MATRIX *A, MATRIX *B)
441
{
442
MATRIX *C;
443
444
int i, j, k, l, power;
445
446
int nrowa = NROW(A), ncola = NCOL(A);
447
int nrowb = NROW(B), ncolb = NCOL(B);
448
int ncolc;
449
450
double *a = MATR(A), *b = MATR(B), *c;
451
452
double *v, value;
453
454
if (nrowb != 1 || ncolb != 1) error("Pow: Matrix ^ Matrix ?.\n");
455
456
if (nrowa == 1 || ncola != nrowa)
457
{
458
C = mat_new(TYPE(A), nrowa, ncola); c = MATR(C);
459
value = *b; nrowa *= ncola;
460
for(i = 0; i < nrowa; i++) *c++ = pow(*a++, value);
461
462
return C;
463
}
464
465
power = (int)*b;
466
467
if (power == 0) {
468
C = mat_new(TYPE(A), nrowa, ncola);
469
ncolc = ncola; c = MATR(C);
470
for(i = 0; i < nrowa; i++) MC(i,i) = 1;
471
}
472
else if (abs(power) == 1)
473
{
474
C = mat_copy(A);
475
}
476
else
477
{
478
v = (double *)ALLOCMEM(nrowa * sizeof(double));
479
480
C = mat_new(TYPE(A), nrowa, nrowa);
481
c = MATR(C); b = MATR(A);
482
483
for(l = 1; l < abs(power); l++) {
484
for(i = 0; i < nrowa; i++)
485
{
486
for(j = 0; j < nrowa; j++)
487
{
488
v[j] = 0.0;
489
for(k = 0; k < nrowa; k++) v[j] += b[k] * MA(k,j);
490
}
491
for(j = 0; j < nrowa; j++) *c++ = v[j];
492
b += nrowa;
493
}
494
a = MATR(A); b = c = MATR(C);
495
}
496
FREEMEM((char *)v);
497
}
498
499
if (power < 0)
500
{
501
VARIABLE *inv, *tmp;
502
tmp = (VARIABLE *)ALLOCMEM(VARIABLESIZE);
503
tmp -> this = C;
504
inv = mtr_inv(tmp);
505
mat_free(C);
506
FREEMEM((char *)tmp);
507
C = inv->this;
508
REFCNT(inv)++;
509
var_delete_temp(inv);
510
}
511
512
return C;
513
}
514
515
MATRIX *opr_trans(MATRIX *A)
516
{
517
MATRIX *C;
518
519
int i, j;
520
521
int ncola = NCOL(A), nrowa = NROW(A);
522
int ncolc;
523
524
double *a = MATR(A), *c;
525
526
C = mat_new(TYPE(A),ncola,nrowa);
527
c = MATR(C); ncolc = nrowa;
528
529
for(i = 0; i < nrowa; i++)
530
for(j = 0; j < ncola; j++) MC(j,i) = *a++;
531
532
return C;
533
}
534
535
MATRIX *opr_reduction(MATRIX *A, MATRIX *B)
536
{
537
MATRIX *C;
538
539
int i;
540
541
int nrowa = NROW(A), ncola = NCOL(A);
542
int nrowb = NROW(B), ncolb = NCOL(B);
543
544
double *a = MATR(A), *b = MATR(B), *c;
545
546
if ((nrowa == nrowb) && (ncola == ncolb))
547
{
548
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
549
nrowa *= ncola;
550
for(i = 0; i < nrowa; i++, a++) *c++ = (*b++) ? (*a) : (0);
551
}
552
else
553
error("Incompatible for reduction.\n");
554
555
return C;
556
}
557
558
559
MATRIX *opr_lt(MATRIX *A, MATRIX *B)
560
{
561
MATRIX *C;
562
563
int i;
564
565
int nrowa = NROW(A), ncola = NCOL(A);
566
int nrowb = NROW(B), ncolb = NCOL(B);
567
568
double *a = MATR(A), *b = MATR(B), *c;
569
570
if ((nrowa == 1) && (ncola == 1))
571
{
572
C = mat_new(TYPE(B),nrowb, ncolb); c = MATR(C);
573
nrowb *= ncolb;
574
for(i = 0; i < nrowb; i++,c++) if (*a < b[i]) *c = 1;
575
}
576
577
else if ((nrowb == 1) && (ncolb == 1))
578
{
579
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
580
nrowa *= ncola;
581
for(i = 0; i < nrowa; i++,c++) if (a[i] < *b) *c = 1;
582
}
583
584
else if ((nrowa == nrowb) && (ncola == ncolb))
585
{
586
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
587
nrowa *= ncola;
588
for(i = 0; i < nrowa; i++,c++) if (a[i] < b[i]) *c = 1;
589
}
590
else
591
error("lt: Incompatible for comparison.\n");
592
593
return C;
594
}
595
596
597
MATRIX *opr_le(MATRIX *A, MATRIX *B)
598
{
599
MATRIX *C;
600
601
int i;
602
603
int nrowa = NROW(A), ncola = NCOL(A);
604
int nrowb = NROW(B), ncolb = NCOL(B);
605
606
double *a = MATR(A), *b = MATR(B), *c;
607
608
if ((nrowa == 1) && (ncola == 1))
609
{
610
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
611
nrowb *= ncolb;
612
for(i = 0; i < nrowb; i++,c++) if (*a <= b[i]) *c = 1;
613
}
614
615
else if ((nrowb == 1) && (ncolb == 1))
616
{
617
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
618
nrowa *= ncola;
619
for(i = 0; i < nrowa; i++,c++) if (a[i] <= *b) *c = 1;
620
}
621
622
else if ((nrowa == nrowb) && (ncola == ncolb))
623
{
624
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
625
nrowa *= ncola;
626
for(i = 0; i < nrowa; i++,c++) if (a[i] <= b[i]) *c = 1;
627
}
628
else
629
error("le: Incompatible for comparison.\n");
630
631
return C;
632
}
633
634
635
MATRIX *opr_gt(MATRIX *A, MATRIX *B)
636
{
637
MATRIX *C;
638
int i;
639
640
int nrowa = NROW(A), ncola = NCOL(A);
641
int nrowb = NROW(B), ncolb = NCOL(B);
642
643
double *a = MATR(A), *b = MATR(B), *c;
644
645
if ((nrowa == 1) && (ncola == 1))
646
{
647
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
648
nrowb *= ncolb;
649
for(i = 0; i < nrowb; i++,c++) if (*a > b[i]) *c = 1;
650
}
651
652
else if ((nrowb == 1) && (ncolb == 1))
653
{
654
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
655
nrowa *= ncola;
656
for(i = 0; i < nrowa; i++,c++) if (a[i] > *b) *c = 1;
657
}
658
659
else if ((nrowa == nrowb) && (ncola == ncolb))
660
{
661
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
662
nrowa *= ncola;
663
for(i = 0; i < nrowa; i++,c++) if (a[i] > b[i]) *c = 1;
664
}
665
666
else
667
error("gt: Incompatible for comparison.\n");
668
669
return C;
670
}
671
672
673
MATRIX *opr_ge(MATRIX *A, MATRIX *B)
674
{
675
MATRIX *C;
676
int i;
677
678
int nrowa = NROW(A), ncola = NCOL(A);
679
int nrowb = NROW(B), ncolb = NCOL(B);
680
681
double *a = MATR(A), *b = MATR(B), *c;
682
683
if ((nrowa == 1) && (ncola == 1))
684
{
685
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
686
nrowb *= ncolb;
687
for(i = 0; i < nrowa; i++,c++) if (*a >= b[i]) *c = 1;
688
}
689
690
else if ((nrowb == 1) && (ncolb == 1))
691
{
692
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
693
nrowa *= ncola;
694
for(i = 0; i < nrowa; i++,c++) if (a[i] >= *b) *c = 1;
695
}
696
697
else if ((nrowa == nrowb) && (ncola == ncolb))
698
{
699
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
700
nrowa *= ncola;
701
for(i = 0; i < nrowa; i++,c++) if (a[i] >= b[i]) *c = 1;
702
}
703
704
else
705
error("ge: Incompatible for comparison.\n");
706
707
return C;
708
}
709
710
711
MATRIX *opr_eq(MATRIX *A, MATRIX *B)
712
{
713
MATRIX *C;
714
int i;
715
716
int nrowa = NROW(A), ncola = NCOL(A);
717
int nrowb = NROW(B), ncolb = NCOL(B);
718
719
double *a = MATR(A), *b = MATR(B), *c;
720
721
if ((nrowa == 1) && (ncola == 1))
722
{
723
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
724
nrowb *= ncolb;
725
for(i = 0; i < nrowb; i++,c++) if (*a == b[i]) *c = 1;
726
}
727
728
else if ((nrowb == 1) && (ncolb == 1))
729
{
730
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
731
nrowa *= ncola;
732
for(i = 0; i < nrowa; i++,c++) if (a[i] == *b) *c = 1;
733
}
734
735
else if ((nrowa == nrowb) && (ncola == ncolb))
736
{
737
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
738
nrowa *= ncola;
739
for(i = 0; i < nrowa; i++,c++) if (a[i] == b[i]) *c = 1;
740
}
741
742
else
743
error("eq: Incompatible for comparison.\n");
744
745
return C;
746
}
747
748
749
MATRIX *opr_neq(MATRIX *A, MATRIX *B)
750
{
751
MATRIX *C;
752
int i;
753
754
int nrowa = NROW(A), ncola = NCOL(A);
755
int nrowb = NROW(B), ncolb = NCOL(B);
756
757
double *a = MATR(A), *b = MATR(B), *c;
758
759
if ((nrowa == 1) && (ncola == 1))
760
{
761
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
762
nrowb *= ncolb;
763
for(i = 0; i < nrowb; i++,c++) if (*a != b[i]) *c = 1;
764
}
765
766
else if ((nrowb == 1) && (ncolb == 1))
767
{
768
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
769
nrowa *= ncola;
770
for(i = 0; i < nrowa; i++,c++) if (a[i] != *b) *c = 1;
771
}
772
773
else if ((nrowa == nrowb) && (ncola == ncolb))
774
{
775
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
776
nrowa *= ncola;
777
for(i = 0; i < nrowa; i++,c++) if (a[i] != b[i]) *c = 1;
778
}
779
780
else
781
error("neq: Incompatible for comparison.\n");
782
783
return C;
784
}
785
786
MATRIX *opr_or(MATRIX *A, MATRIX *B)
787
{
788
MATRIX *C;
789
int i;
790
791
int nrowa = NROW(A), ncola = NCOL(A);
792
int nrowb = NROW(B), ncolb = NCOL(B);
793
794
double *a = MATR(A), *b = MATR(B), *c;
795
796
if ((nrowa == 1) && (ncola == 1))
797
{
798
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
799
nrowb *= ncolb;
800
for(i = 0; i < nrowb; i++) *c++ = (*a) || (b[i]);
801
}
802
803
else if ((nrowb == 1) && (ncolb == 1))
804
{
805
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
806
nrowa *= ncola;
807
for(i = 0; i < nrowa; i++) *c++ = (a[i]) || (*b);
808
}
809
810
else if ((nrowa == nrowb) && (ncola == ncolb))
811
{
812
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
813
nrowa *= ncola;
814
for(i = 0; i < nrowa; i++) *c++ = (a[i]) || (b[i]);
815
}
816
817
else
818
error("or: Incompatible for comparison.\n");
819
820
return C;
821
}
822
823
MATRIX *opr_and(MATRIX *A, MATRIX *B)
824
{
825
MATRIX *C;
826
int i;
827
828
int nrowa = NROW(A), ncola = NCOL(A);
829
int nrowb = NROW(B), ncolb = NCOL(B);
830
831
double *a = MATR(A), *b = MATR(B), *c;
832
833
if ((nrowa == 1) && (ncola == 1))
834
{
835
C = mat_new(TYPE(B),nrowb,ncolb); c = MATR(C);
836
nrowb *= ncolb;
837
for(i = 0; i < nrowb; i++) *c++ = (*a) && (b[i]);
838
}
839
840
else if ((nrowb == 1) && (ncolb == 1))
841
{
842
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
843
nrowa *= ncola;
844
for(i = 0; i < nrowa; i++) *c++ = (a[i]) && (*b);
845
}
846
847
else if ((nrowa == nrowb) && (ncola == ncolb))
848
{
849
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
850
nrowa *= ncola;
851
for(i = 0; i < nrowa; i++) *c++ = (a[i]) && (b[i]);
852
}
853
854
else
855
error("and: Incompatible for comparison.\n");
856
857
return C;
858
}
859
860
MATRIX *opr_not(MATRIX *A)
861
{
862
MATRIX *C;
863
int i;
864
865
int nrowa = NROW(A), ncola = NCOL(A);
866
867
double *a = MATR(A), *c;
868
869
C = mat_new(TYPE(A),nrowa,ncola); c = MATR(C);
870
nrowa *= ncola;
871
for(i = 0; i < nrowa; i++,c++) if (*a == 0) *c = 1;
872
873
return C;
874
}
875
876