Loading...
Searching...
No Matches
MathOperators_vector.tpp
1/*---------------------------------------------------------------------------*\
2 *
3 * bitpit
4 *
5 * Copyright (C) 2015-2021 OPTIMAD engineering Srl
6 *
7 * -------------------------------------------------------------------------
8 * License
9 * This file is part of bitpit.
10 *
11 * bitpit is free software: you can redistribute it and/or modify it
12 * under the terms of the GNU Lesser General Public License v3 (LGPL)
13 * as published by the Free Software Foundation.
14 *
15 * bitpit is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
18 * License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with bitpit. If not, see <http://www.gnu.org/licenses/>.
22 *
23\*---------------------------------------------------------------------------*/
24
25// ================================================================================== //
26// MATH OPERATORS //
27// //
28// Basic math operators for vectors. //
29// ================================================================================== //
30// INFO //
31// ================================================================================== //
32// Author : Alessandro Alaia //
33// Version : v3.0 //
34// //
35// All rights reserved. //
36// ================================================================================== //
37
38// ================================================================================== //
39// TEMPLATE IMPLEMENTATIONS //
40// ================================================================================== //
46// Operator "min" =================================================================== //
47
48// ---------------------------------------------------------------------------------- //
65template <class T>
66std::vector< T > min(
67 const std::vector< T > &x,
68 const std::vector< T > &y
69) {
70
71using namespace std;
72
73// ================================================================================== //
74// VARIABLES DECLARATION //
75// ================================================================================== //
76int n = std::min(x.size(), y.size());
77int m = std::max(x.size(), y.size());
78std::vector< T > z(m);
79
80// ================================================================================== //
81// COMPARE VECTORS //
82// ================================================================================== //
83for (int i = 0; i < n; i++) {
84 z[i] = min(x[i], y[i]);
85} //next i
86
87return(z); };
88
89// ---------------------------------------------------------------------------------- //
106template <class T>
107std::vector< T > min(
108 const std::vector< T > &x,
109 const T &y
110) {
111
112using namespace std;
113
114// ================================================================================== //
115// VARIABLES DECLARATION //
116// ================================================================================== //
117int n = x.size();
118std::vector< T > z(n);
119
120// ================================================================================== //
121// COMPARE VECTOR AND SCALAR //
122// ================================================================================== //
123for (int i = 0; i < n; i++) {
124 z[i] = min(x[i], y);
125} //next i
126
127return(z); };
128
129// ---------------------------------------------------------------------------------- //
146template <class T>
147std::vector< T > min(
148 const T &x,
149 const std::vector< T > &y
150) {
151
152using namespace std;
153
154// ================================================================================== //
155// VARIABLES DECLARATION //
156// ================================================================================== //
157std::vector< T > z;
158
159// ================================================================================== //
160// COMPARE VECTOR AND SCALAR //
161// ================================================================================== //
162z = min(y, x);
163
164return(z); };
165
166// ---------------------------------------------------------------------------------- //
183template <class T>
184std::vector< std::vector< T > > min(
185 const std::vector< std::vector < T > > &x,
186 const T &y
187) {
188
189using namespace std;
190
191// ================================================================================== //
192// VARIABLES DECLARATION //
193// ================================================================================== //
194int n = x.size();
195std::vector< std::vector< T > > z(n);
196
197// ================================================================================== //
198// COMPARE VECTOR AND SCALAR //
199// ================================================================================== //
200for (int i = 0; i < n; i++) {
201 z[i] = min(x[i], y);
202} //next i
203
204return(z); };
205
206// ---------------------------------------------------------------------------------- //
223template <class T>
224std::vector< std::vector < T > > min(
225 const T &x,
226 const std::vector< std::vector< T > > &y
227) {
228
229using namespace std;
230
231// ================================================================================== //
232// VARIABLES DECLARATION //
233// ================================================================================== //
234std::vector< std::vector< T > > z;
235
236// ================================================================================== //
237// COMPARE VECTOR AND SCALAR //
238// ================================================================================== //
239z = min(y, x);
240
241return(z); };
242
243// Operator "minval" ================================================================ //
244
245// ---------------------------------------------------------------------------------- //
252template <typename T, typename std::enable_if< std::is_scalar< T >::value>::type*>
253void inline minval(
254 const T &x,
255 T &min_value
256) {
257
258// ================================================================================== //
259// template <typename T, //
260// typename std::enable_if< std::is_scalar< T >::value>::type* = nullptr> //
261// void inline minval( //
262// const T &x, //
263// T &min_value) //
264// //
265// Overloading of minval function for scalar types. //
266// ================================================================================== //
267// INPUT //
268// ================================================================================== //
269// - x : T, input scalar //
270// - min_value : T, on output stores the input value. //
271// ================================================================================== //
272// OUTPUT //
273// ================================================================================== //
274// - none //
275// ================================================================================== //
276
277// ================================================================================== //
278// VARIABLES DECLARATION //
279// ================================================================================== //
280
281// Local variables
282// none
283
284// Counters
285// none
286
287// ================================================================================== //
288// COMPUTE THE MIN VALUE //
289// ================================================================================== //
290min_value = x;
291
292return; };
293
294// ---------------------------------------------------------------------------------- //
308template <class T, class T1>
310 const std::vector<T> &x,
311 T1 &min_value
312) {
313
314// ================================================================================== //
315// VARIABLES DECLARATION //
316// ================================================================================== //
317
318// Local variables
319T1 value;
320
321// Counters
322int i, n;
323
324// ================================================================================== //
325// FIND THE MIN-VALUE //
326// ================================================================================== //
327n = x.size();
328if (n > 0) {
329 minval(x[0], min_value);
330 for (i = 1; i < n; i++) {
331 minval(x[i], value);
332 if (value < min_value) {
333 min_value = value;
334 }
335 } //next i
336}
337
338return; };
339
340// Operator "max" =================================================================== //
341
342// ---------------------------------------------------------------------------------- //
359template <class T>
360std::vector<T> max(
361 const std::vector< T > &x,
362 const std::vector< T > &y
363) {
364
365using namespace std;
366
367// ================================================================================== //
368// VARIABLES DECLARATION //
369// ================================================================================== //
370int n = std::min(x.size(), y.size());
371int m = std::max(x.size(), y.size());
372std::vector< T > z(m);
373
374// ================================================================================== //
375// COMPARE VECTORS //
376// ================================================================================== //
377for (int i = 0; i < n; i++) {
378 z[i] = max(x[i], y[i]);
379} //next i
380
381return(z); };
382
383// ---------------------------------------------------------------------------------- //
400template <class T>
401std::vector< T > max(
402 const std::vector< T > &x,
403 const T &y
404) {
405
406using namespace std;
407
408// ================================================================================== //
409// VARIABLES DECLARATION //
410// ================================================================================== //
411int n = x.size();
412std::vector<T> z(n);
413
414// ================================================================================== //
415// COMPARE VECTOR AND SCALAR //
416// ================================================================================== //
417for (int i = 0; i < n; i++) {
418 z[i] = max(x[i], y);
419} //next i
420
421return(z); };
422
423// ---------------------------------------------------------------------------------- //
440template <class T>
441std::vector< T > max(
442 const T &x,
443 const std::vector< T > &y
444) {
445
446using namespace std;
447
448// ================================================================================== //
449// VARIABLES DECLARATION //
450// ================================================================================== //
451std::vector< T > z;
452
453// ================================================================================== //
454// COMPARE VECTOR AND SCALAR //
455// ================================================================================== //
456z = max(y, x);
457
458return(z); };
459
460// ---------------------------------------------------------------------------------- //
477template <class T>
478std::vector< std::vector< T > > max(
479 const std::vector< std::vector< T > > &x,
480 const T &y
481) {
482
483using namespace std;
484
485// ================================================================================== //
486// VARIABLES DECLARATION //
487// ================================================================================== //
488int n = x.size();
489std::vector< std::vector< T > > z(n);
490
491// ================================================================================== //
492// COMPARE VECTOR AND SCALAR //
493// ================================================================================== //
494for (int i = 0; i < n; i++) {
495 z[i] = max(x[i], y);
496} //next i
497
498return(z); };
499
500// ---------------------------------------------------------------------------------- //
517template <class T>
518std::vector< std::vector< T > > max(
519 const T &x,
520 const std::vector< std::vector< T > > &y
521) {
522
523using namespace std;
524
525// ================================================================================== //
526// VARIABLES DECLARATION //
527// ================================================================================== //
528std::vector< std::vector< T > > z;
529
530// ================================================================================== //
531// COMPARE VECTOR AND SCALAR //
532// ================================================================================== //
533z = max(y, x);
534
535return(z); };
536
537// Operator "maxval" ================================================================ //
538
539// ---------------------------------------------------------------------------------- //
546template <typename T, typename std::enable_if< std::is_scalar< T >::value>::type*>
547void inline maxval(
548 const T &x,
549 T &max_value
550) {
551
552// ================================================================================== //
553// template <typename T, //
554// typename std::enable_if< std::is_scalar< T >::value>::type* = nullptr> //
555// void inline maxval( //
556// const T &x, //
557// T &max_value) //
558// //
559// Overloading of maxval function for scalar types. //
560// ================================================================================== //
561// INPUT //
562// ================================================================================== //
563// - x : T, input scalar //
564// - max_value : T, on output stores the input value //
565// ================================================================================== //
566// OUTPUT //
567// ================================================================================== //
568// - none //
569// ================================================================================== //
570
571// ================================================================================== //
572// VARIABLES DECLARATION //
573// ================================================================================== //
574
575// Local variables
576// none
577
578// Counters
579// none
580
581// ================================================================================== //
582// COMPUTE THE MIN VALUE //
583// ================================================================================== //
584max_value = x;
585
586return; };
587
588// ---------------------------------------------------------------------------------- //
602template <class T, class T1>
604 const std::vector<T> &x,
605 T1 &max_value
606) {
607
608// ================================================================================== //
609// VARIABLES DECLARATION //
610// ================================================================================== //
611
612// Local variables
613T1 value;
614
615// Counters
616int i, n;
617
618// ================================================================================== //
619// FIND THE MIN-VALUE //
620// ================================================================================== //
621n = x.size();
622if (n > 0) {
623 maxval(x[0], max_value);
624 for (i = 1; i < n; i++) {
625 maxval(x[i], value);
626 if (value > max_value) {
627 max_value = value;
628 }
629 } //next i
630}
631
632return; };
633
634// Operator "sum" =================================================================== //
635
636// ---------------------------------------------------------------------------------- //
643template<class T, typename std::enable_if< std::is_scalar< T >::value>::type*>
644void inline sum(
645 const T &x,
646 T &s
647) {
648
649// ================================================================================== //
650// template<class T, //
651// typename std::enable_if< std::is_scalar< T >::value>::type* = nullptr> //
652// void inline sum( //
653// const T &x, //
654// T &s) //
655// //
656// Overloading of sum() function for scalar type. //
657// ================================================================================== //
658// INPUT //
659// ================================================================================== //
660// - x : int, dummy input //
661// - s : int, dummy output //
662// ================================================================================== //
663// OUTPUT //
664// ================================================================================== //
665// - none //
666// ================================================================================== //
667
668// ================================================================================== //
669// VARIABLES DECLARATION //
670// ================================================================================== //
671
672// Local variables
673// none
674
675// Counters
676// none
677
678// ================================================================================== //
679// PERFORM DUMMY SUM //
680// ================================================================================== //
681s = x;
682
683return; };
684
685// ---------------------------------------------------------------------------------- //
699template <class T, class T1>
700void sum(
701 const std::vector< T > &x,
702 T1 &s
703) {
704
705// ================================================================================== //
706// VARIABLES DECLARATION //
707// ================================================================================== //
708
709// Local variables
710int n = x.size();
711T1 value;
712
713// Counters
714int i;
715
716// ================================================================================== //
717// PERFORM SUMMATION //
718// ================================================================================== //
719if (n > 0) {
720 sum(x[0], s);
721 for (i = 1; i < n; i++) {
722 sum(x[i], value);
723 s += value;
724 } //next i
725}
726
727return; };
728
729// Operator "abs" =================================================================== //
730
731// ---------------------------------------------------------------------------------- //
747template <class T>
748std::vector<T> abs(
749 const std::vector< T > &x
750) {
751
752using namespace std;
753
754// ================================================================================== //
755// VARIABLES DECLARATION //
756// ================================================================================== //
757
758// Local variables
759int n = x.size();
760std::vector< T > z;
761
762// Counters
763int i;
764
765// ================================================================================== //
766// COMPUTE THE ABSOLUTE VALUE OF A VECTOR //
767// ================================================================================== //
768if (n > 0) {
769 z.resize(n);
770 for (i = 0; i < n; i++) {
771 z[i] = abs(x[i]);
772 } //next i
773}
774
775return(z); };
776
777// Operator "pow" =================================================================== //
778
779// ---------------------------------------------------------------------------------- //
795template <class T>
796std::vector< T > pow(
797 std::vector< T > &x,
798 double p
799) {
800
801// ================================================================================== //
802// VARIABLES DECLARATION //
803// ================================================================================== //
804
805// Local variables
806int n;
807std::vector< T > y;
808
809// Counters
810int i;
811
812// ================================================================================== //
813// COMPUTE ELEMENT-WISE POWER //
814// ================================================================================== //
815n = x.size();
816y.resize(n);
817for (i = 0; i < n; i++) {
818 y[i] = static_cast<T>(pow(x[i], p));
819} //next i
820
821return(y); };
822
823// Operator "norm" ================================================================== //
824
825// ---------------------------------------------------------------------------------- //
836template <class T>
837double norm1(
838 const std::vector< T > &x
839) {
840
841using namespace std;
842
843// ================================================================================== //
844// VARIABLES DECLARATION //
845// ================================================================================== //
846
847// Local variables
848int n = x.size();
849double z = 0.0;
850
851// Counters
852int i;
853
854// ================================================================================== //
855// COMPUTE THE P-NORM //
856// ================================================================================== //
857if (n > 0) {
858 for (i = 0; i < n; i++) {
859 z += abs(x[i]);
860 } //next i
861}
862
863return(z); };
864
865// ---------------------------------------------------------------------------------- //
876template <class T>
877double norm2(
878 const std::vector< T > &x
879) {
880
881// ================================================================================== //
882// VARIABLES DECLARATION //
883// ================================================================================== //
884
885// Local variables
886int n = x.size();
887double z = 0.0;
888
889// Counters
890int i;
891
892// ================================================================================== //
893// COMPUTE THE P-NORM //
894// ================================================================================== //
895if (n > 0) {
896 for (i = 0; i < n; i++) {
897 z += x[i]*x[i];
898 } //next i
899}
900
901return(sqrt(z)); };
902
903// ---------------------------------------------------------------------------------- //
915template <class T>
916double norm(
917 const std::vector< T > &x,
918 int p
919) {
920
921using namespace std;
922
923// ================================================================================== //
924// VARIABLES DECLARATION //
925// ================================================================================== //
926
927// Local variables
928int n = x.size();
929double z = 0.0;
930double t, y;
931
932// Counters
933int i, j;
934
935// ================================================================================== //
936// COMPUTE THE P-NORM //
937// ================================================================================== //
938if (p == 1) { return(norm1(x)); }
939if (p == 2) { return(norm2(x)); }
940
941if (n > 0) {
942 for (i = 0; i < n; i++) {
943 y = 1.0;
944 t = x[i];
945 for (j = 1; j <= p; j++) {
946 y = y*t;
947 } //next j
948 z += abs(y);
949 } //next i
950}
951
952return(std::exp(std::log(std::max(z, 1.0e-307))/((double) p))); };
953
954// ---------------------------------------------------------------------------------- //
965template <class T>
966double normInf(
967 const std::vector< T > &x
968) {
969
970using namespace std;
971
972// ================================================================================== //
973// VARIABLES DECLARATION //
974// ================================================================================== //
975
976// Local variables
977int n = x.size();
978double z = 0.0, y;
979
980// Counters
981int i;
982
983// ================================================================================== //
984// COMPUTE THE inf-NORM //
985// ================================================================================== //
986if (n > 0) {
987 z = abs(x[0]);
988 for (i = 1; i < n; i++) {
989 y = abs(x[i]);
990 if (y > z) {
991 z = y;
992 }
993 } //next i
994}
995
996return(z); };
997
998// Operator "dotProduct" =========================================================== //
999
1000// ---------------------------------------------------------------------------------- //
1012template <class T>
1014 const std::vector< T > &x,
1015 const std::vector< T > &y
1016) {
1017
1018// ================================================================================== //
1019// VARIABLES DECLARATION //
1020// ================================================================================== //
1021
1022// Local variables
1023int n = x.size(), m = y.size();
1024T dp = ((T) 0.0);
1025
1026// Counters
1027int i;
1028
1029// ================================================================================== //
1030// COMPUTE THE DOT PRODUCT //
1031// ================================================================================== //
1032if ((n > 0) && (n == m)) {
1033 for (i = 0; i < n; i++) {
1034 dp += x[i]*y[i];
1035 } //next i
1036}
1037
1038return(dp); };
1039
1040// Operator "crossProduct" ========================================================= //
1041
1042// ---------------------------------------------------------------------------------- //
1052template <class T>
1053std::vector<T> crossProduct(
1054 const std::vector<T> &x,
1055 const std::vector<T> &y
1056) {
1057
1058// =================================================================================== //
1059// VARIABLES DECLARATION //
1060// =================================================================================== //
1061std::vector<T> z(3, T{});
1062
1063// =================================================================================== //
1064// COMPUTE THE EXTERNAL PRODUCT //
1065// =================================================================================== //
1066z[0] = x[1] * y[2] - x[2] * y[1];
1067z[1] = x[2] * y[0] - x[0] * y[2];
1068z[2] = x[0] * y[1] - x[1] * y[0];
1069
1070return (z);}
std::vector< T > pow(std::vector< T > &x, double p)
double norm1(const std::vector< T > &x)
double norm2(const std::vector< T > &x)
std::vector< T > crossProduct(const std::vector< T > &x, const std::vector< T > &y)
void minval(const T &x, T &min_value)
std::vector< T > max(const std::vector< T > &x, const std::vector< T > &y)
T dotProduct(const std::vector< T > &x, const std::vector< T > &y)
std::vector< T > abs(const std::vector< T > &x)
void sum(const T &x, T &s)
void maxval(const T &x, T &max_value)
double normInf(const std::vector< T > &x)
double norm(const std::vector< T > &x, int p)
std::vector< T > min(const std::vector< T > &x, const std::vector< T > &y)
--- layout: doxygen_footer ---