1 #include "TMV_Test.h"
2 #include "TMV_Test_1.h"
3 #include "TMV.h"
4 
5 #define NOELEMMULT
6 
7 #include "TMV_TestMatrixArith.h"
8 
TestTriMatrixArith_C6a()9 template <class T> void TestTriMatrixArith_C6a()
10 {
11     typedef std::complex<T> CT;
12 
13     tmv::Matrix<T,tmv::RowMajor> a1x(4,4);
14     for(int i=0;i<4;++i) for(int j=0;j<4;++j) {
15         a1x(i,j) = T(3+4*i-6*j);
16     }
17     a1x(0,0) = 14;
18     a1x(1,0) = -2;
19     a1x(2,0) = 7;
20     a1x(3,0) = -10;
21     a1x(2,2) = 30;
22 
23     tmv::Matrix<CT,tmv::RowMajor> ca1x = a1x;
24     ca1x(2,3) += CT(2,3);
25     ca1x(1,0) *= CT(0,2);
26     ca1x.col(1) *= CT(-1,3);
27     ca1x.row(3) += tmv::Vector<CT>(4,CT(1,9));
28 
29     tmv::Matrix<T,tmv::ColMajor> a2x = a1x.transpose();
30     a2x.row(1) *= T(3);
31     a2x.col(2) -= tmv::Vector<T>(4,4);
32     tmv::Matrix<CT,tmv::ColMajor> ca2x = ca1x;
33     ca2x -= a2x;
34     ca2x *= CT(1,-2);
35     ca2x(0,0) = CT(0,-5);
36 
37     tmv::UpperTriMatrixView<T> u1 = a1x.upperTri();
38     tmv::UpperTriMatrixView<CT> cu1 = ca1x.upperTri();
39     tmv::UpperTriMatrixView<T> u2 = a2x.upperTri();
40     tmv::UpperTriMatrixView<CT> cu2 = ca2x.upperTri();
41 
42     tmv::DiagMatrixView<T> d1 = DiagMatrixViewOf(a1x.row(0));
43     tmv::DiagMatrixView<CT> cd1 = DiagMatrixViewOf(ca1x.row(0));
44 
45     TestMatrixArith6(u1,cu1,d1,cd1,u1,cu1,"UpperTri/Diag 1");
46 #if (XTEST & 2)
47     TestMatrixArith6(u2,cu2,d1,cd1,u1,cu1,"UpperTri/Diag 2");
48     TestMatrixArith6(u2,cu2,d1,cd1,u2,cu2,"UpperTri/Diag 3");
49     TestMatrixArith6(u1,cu1,d1,cd1,u2,cu2,"UpperTri/Diag 4");
50 #endif
51 #if (XTEST & 1)
52     tmv::Matrix<T> a3x(12,16);
53     for(int i=0;i<12;++i) for(int j=0;j<16;++j) a3x(i,j) = T(1-2*i+3*j);
54     a3x.diag().addToAll(30);
55     tmv::Matrix<CT> ca3x = a3x*CT(1,-2);
56     ca3x.diag().addToAll(CT(-22,15));
57 
58     tmv::DiagMatrixView<T> d3 = DiagMatrixViewOf(a1x.diag());
59     tmv::DiagMatrixView<CT> cd3 = DiagMatrixViewOf(ca1x.diag());
60     tmv::UpperTriMatrixView<T> u3 = a3x.subMatrix(0,12,0,16,3,4).upperTri();
61     tmv::UpperTriMatrixView<CT> cu3 = ca3x.subMatrix(0,12,0,16,3,4).upperTri();
62     TestMatrixArith6(u3,cu3,d1,cd1,u1,cu1,"UpperTri/Diag 5");
63     TestMatrixArith6(u1,cu1,d3,cd3,u1,cu1,"UpperTri/Diag 6");
64     TestMatrixArith6(u2,cu2,d3,cd3,u1,cu1,"UpperTri/Diag 7");
65     TestMatrixArith6(u1,cu1,d1,cd1,u3,cu3,"UpperTri/Diag 8");
66     TestMatrixArith6(u2,cu2,d1,cd1,u3,cu3,"UpperTri/Diag 9");
67 #endif
68     TestMatrixArith6x(u1,cu1,d1,cd1,"UpperTri/Diag 10");
69 #if (XTEST & 2)
70     TestMatrixArith6x(u2,cu2,d1,cd1,"UpperTri/Diag 11");
71 #endif
72 #if (XTEST & 1)
73     TestMatrixArith6x(u3,cu3,d1,cd1,"UpperTri/Diag 12");
74     TestMatrixArith6x(u1,cu1,d3,cd3,"UpperTri/Diag 13");
75     TestMatrixArith6x(u2,cu2,d3,cd3,"UpperTri/Diag 14");
76 #endif
77 
78     tmv::LowerTriMatrixView<T> l1 = a1x.lowerTri();
79     tmv::LowerTriMatrixView<CT> cl1 = ca1x.lowerTri();
80     tmv::LowerTriMatrixView<T> l2 = a2x.lowerTri();
81     tmv::LowerTriMatrixView<CT> cl2 = ca2x.lowerTri();
82 
83     TestMatrixArith6(l1,cl1,d1,cd1,l1,cl1,"LowerTri/Diag 1");
84 #if (XTEST & 2)
85     TestMatrixArith6(l2,cl2,d1,cd1,l1,cl1,"LowerTri/Diag 2");
86     TestMatrixArith6(l2,cl2,d1,cd1,l2,cl2,"LowerTri/Diag 3");
87     TestMatrixArith6(l1,cl1,d1,cd1,l2,cl2,"LowerTri/Diag 4");
88 #endif
89 #if (XTEST & 1)
90     tmv::LowerTriMatrixView<T> l3 = a3x.subMatrix(0,12,0,16,3,4).lowerTri();
91     tmv::LowerTriMatrixView<CT> cl3 = ca3x.subMatrix(0,12,0,16,3,4).lowerTri();
92     TestMatrixArith6(l3,cl3,d1,cd1,l1,cl1,"LowerTri/Diag 5");
93     TestMatrixArith6(l1,cl1,d3,cd3,l1,cl1,"LowerTri/Diag 6");
94     TestMatrixArith6(l2,cl2,d3,cd3,l1,cl1,"LowerTri/Diag 7");
95     TestMatrixArith6(l1,cl1,d1,cd1,l3,cl3,"LowerTri/Diag 8");
96     TestMatrixArith6(l2,cl2,d1,cd1,l3,cl3,"LowerTri/Diag 9");
97 #endif
98     TestMatrixArith6x(l1,cl1,d1,cd1,"LowerTri/Diag 10");
99 #if (XTEST & 2)
100     TestMatrixArith6x(l2,cl2,d1,cd1,"LowerTri/Diag 11");
101 #endif
102 #if (XTEST & 1)
103     TestMatrixArith6x(l3,cl3,d1,cd1,"LowerTri/Diag 12");
104     TestMatrixArith6x(l1,cl1,d3,cd3,"LowerTri/Diag 13");
105     TestMatrixArith6x(l2,cl2,d3,cd3,"LowerTri/Diag 14");
106 #endif
107 
108     tmv::UpperTriMatrixView<T> u4 = a1x.unitUpperTri();
109     tmv::UpperTriMatrixView<CT> cu4 = ca1x.unitUpperTri();
110     tmv::UpperTriMatrixView<T> u5 = a2x.unitUpperTri();
111     tmv::UpperTriMatrixView<CT> cu5 = ca2x.unitUpperTri();
112 
113     TestMatrixArith6(u4,cu4,d1,cd1,u1,cu1,"UpperTri/Diag 15");
114     TestMatrixArith6(u5,cu5,d1,cd1,u1,cu1,"UpperTri/Diag 16");
115     TestMatrixArith6(u4,cu4,d1,cd1,u2,cu2,"UpperTri/Diag 17");
116     TestMatrixArith6(u5,cu5,d1,cd1,u2,cu2,"UpperTri/Diag 18");
117 #if (XTEST & 1)
118     tmv::UpperTriMatrixView<T> u6 = a3x.subMatrix(0,12,0,16,3,4).unitUpperTri();
119     tmv::UpperTriMatrixView<CT> cu6 = ca3x.subMatrix(0,12,0,16,3,4).unitUpperTri();
120     TestMatrixArith6(u6,cu6,d1,cd1,u1,cu1,"UpperTri/Diag 19");
121     TestMatrixArith6(u6,cu6,d3,cd3,u1,cu1,"UpperTri/Diag 20");
122     TestMatrixArith6(u4,cu4,d3,cd3,u1,cu1,"UpperTri/Diag 21");
123     TestMatrixArith6(u5,cu5,d3,cd3,u1,cu1,"UpperTri/Diag 22");
124 #endif
125     TestMatrixArith6x(u4,cu4,d1,cd1,"UpperTri/Diag 23");
126 #if (XTEST & 2)
127     TestMatrixArith6x(u5,cu5,d1,cd1,"UpperTri/Diag 24");
128 #endif
129 #if (XTEST & 1)
130     TestMatrixArith6x(u6,cu1,d1,cd1,"UpperTri/Diag 25");
131     TestMatrixArith6x(u6,cu3,d3,cd3,"UpperTri/Diag 26");
132     TestMatrixArith6x(u4,cu4,d3,cd3,"UpperTri/Diag 27");
133     TestMatrixArith6x(u5,cu5,d3,cd3,"UpperTri/Diag 28");
134 #endif
135 
136     tmv::LowerTriMatrixView<T> l4 = a1x.unitLowerTri();
137     tmv::LowerTriMatrixView<CT> cl4 = ca1x.unitLowerTri();
138     tmv::LowerTriMatrixView<T> l5 = a2x.unitLowerTri();
139     tmv::LowerTriMatrixView<CT> cl5 = ca2x.unitLowerTri();
140 
141     TestMatrixArith6(l4,cl4,d1,cd1,l1,cl1,"LowerTri/Diag 15");
142     TestMatrixArith6(l5,cl5,d1,cd1,l1,cl1,"LowerTri/Diag 16");
143     TestMatrixArith6(l4,cl4,d1,cd1,l2,cl2,"LowerTri/Diag 17");
144     TestMatrixArith6(l5,cl5,d1,cd1,l2,cl2,"LowerTri/Diag 18");
145 #if (XTEST & 1)
146     tmv::LowerTriMatrixView<T> l6 = a3x.subMatrix(0,12,0,16,3,4).unitLowerTri();
147     tmv::LowerTriMatrixView<CT> cl6 = ca3x.subMatrix(0,12,0,16,3,4).unitLowerTri();
148     TestMatrixArith6(l6,cl6,d1,cd1,l1,cl1,"LowerTri/Diag 19");
149     TestMatrixArith6(l6,cl6,d3,cd3,l1,cl1,"LowerTri/Diag 20");
150     TestMatrixArith6(l4,cl4,d3,cd3,l1,cl1,"LowerTri/Diag 21");
151     TestMatrixArith6(l5,cl5,d3,cd3,l1,cl1,"LowerTri/Diag 22");
152 #endif
153     TestMatrixArith6x(l4,cl4,d1,cd1,"LowerTri/Diag 23");
154 #if (XTEST & 2)
155     TestMatrixArith6x(l5,cl5,d1,cd1,"LowerTri/Diag 24");
156 #endif
157 #if (XTEST & 1)
158     TestMatrixArith6x(l6,cl1,d1,cd1,"LowerTri/Diag 25");
159     TestMatrixArith6x(l6,cl3,d3,cd3,"LowerTri/Diag 26");
160     TestMatrixArith6x(l4,cl4,d3,cd3,"LowerTri/Diag 27");
161     TestMatrixArith6x(l5,cl5,d3,cd3,"LowerTri/Diag 28");
162 #endif
163 }
164 
165 #ifdef TEST_DOUBLE
166 template void TestTriMatrixArith_C6a<double>();
167 #endif
168 #ifdef TEST_FLOAT
169 template void TestTriMatrixArith_C6a<float>();
170 #endif
171 #ifdef TEST_LONGDOUBLE
172 template void TestTriMatrixArith_C6a<long double>();
173 #endif
174 #ifdef TEST_INT
175 template void TestTriMatrixArith_C6a<int>();
176 #endif
177