1 #include "TMV_Test.h"
2 #include "TMV_Test_1.h"
3 #include "TMV.h"
4 
5 #include "TMV_TestMatrixArith.h"
6 
TestTriMatrixArith_B5a()7 template <class T> void TestTriMatrixArith_B5a()
8 {
9     typedef std::complex<T> CT;
10 
11     tmv::Matrix<T,tmv::RowMajor> a1x(4,4);
12     for(int i=0;i<4;++i) for(int j=0;j<4;++j) {
13         a1x(i,j) = T(3+4*i-6*j);
14     }
15     a1x(0,0) = 14;
16     a1x(1,0) = -2;
17     a1x(2,0) = 7;
18     a1x(3,0) = -10;
19     a1x(2,2) = 30;
20 
21     tmv::Matrix<CT,tmv::RowMajor> ca1x = a1x;
22     ca1x(2,3) += CT(2,3);
23     ca1x(1,0) *= CT(0,2);
24     ca1x.col(1) *= CT(-1,3);
25     ca1x.row(3) += tmv::Vector<CT>(4,CT(1,9));
26 
27     tmv::Matrix<T,tmv::ColMajor> a2x = a1x.transpose();
28     a2x.row(1) *= T(3);
29     a2x.col(2) -= tmv::Vector<T>(4,4);
30     tmv::Matrix<CT,tmv::ColMajor> ca2x = ca1x;
31     ca2x -= a2x;
32     ca2x *= CT(1,-2);
33     ca2x(0,0) = CT(0,-5);
34 
35     tmv::UpperTriMatrixView<T> u1 = a1x.upperTri();
36     tmv::UpperTriMatrixView<CT> cu1 = ca1x.upperTri();
37     tmv::UpperTriMatrixView<T> u2 = a2x.upperTri();
38     tmv::UpperTriMatrixView<CT> cu2 = ca2x.upperTri();
39     tmv::UpperTriMatrixView<T> u4 = a1x.unitUpperTri();
40     tmv::UpperTriMatrixView<CT> cu4 = ca1x.unitUpperTri();
41     tmv::UpperTriMatrixView<T> u5 = a2x.unitUpperTri();
42     tmv::UpperTriMatrixView<CT> cu5 = ca2x.unitUpperTri();
43 
44     tmv::MatrixView<T> a1 = a1x.view();
45     tmv::MatrixView<CT> ca1 = ca1x.view();
46     tmv::MatrixView<T> a2 = a2x.view();
47     tmv::MatrixView<CT> ca2 = ca2x.view();
48 
49     TestMatrixArith5(a1,ca1,u1,cu1,"Square/UpperTri 1");
50     TestMatrixArith5(a1,ca1,u2,cu2,"Square/UpperTri 2");
51     TestMatrixArith5(a1,ca1,u4,cu4,"Square/UpperTri 3");
52     TestMatrixArith5(a1,ca1,u5,cu5,"Square/UpperTri 4");
53     TestMatrixArith5(a2,ca2,u1,cu1,"Square/UpperTri 5");
54 #if (XTEST & 2)
55     TestMatrixArith5(a2,ca2,u2,cu2,"Square/UpperTri 6");
56     TestMatrixArith5(a2,ca2,u4,cu4,"Square/UpperTri 7");
57     TestMatrixArith5(a2,ca2,u5,cu5,"Square/UpperTri 8");
58 #endif
59 #if (XTEST & 1)
60     tmv::Matrix<T> a3x(12,16);
61     for(int i=0;i<12;++i) for(int j=0;j<16;++j) a3x(i,j) = T(1-2*i+3*j);
62     a3x.diag().addToAll(30);
63     tmv::Matrix<CT> ca3x = a3x*CT(1,-2);
64     ca3x.diag().addToAll(CT(-22,15));
65 
66     tmv::UpperTriMatrixView<T> u3 = a3x.subMatrix(0,12,0,16,3,4).upperTri();
67     tmv::UpperTriMatrixView<CT> cu3 = ca3x.subMatrix(0,12,0,16,3,4).upperTri();
68     tmv::UpperTriMatrixView<T> u6 = a3x.subMatrix(0,12,0,16,3,4).unitUpperTri();
69     tmv::UpperTriMatrixView<CT> cu6 = ca3x.subMatrix(0,12,0,16,3,4).unitUpperTri();
70     tmv::MatrixView<T> a3 = a3x.view();
71     tmv::MatrixView<CT> ca3 = ca3x.view();
72     TestMatrixArith5(a3,ca3,u1,cu1,"Square/UpperTri 9");
73     TestMatrixArith5(a3,ca3,u2,cu2,"Square/UpperTri 10");
74     TestMatrixArith5(a3,ca3,u3,cu3,"Square/UpperTri 11");
75     TestMatrixArith5(a3,ca3,u4,cu4,"Square/UpperTri 12");
76     TestMatrixArith5(a3,ca3,u5,cu5,"Square/UpperTri 13");
77     TestMatrixArith5(a3,ca3,u6,cu6,"Square/UpperTri 14");
78     TestMatrixArith5(a1,ca1,u3,cu3,"Square/UpperTri 15");
79     TestMatrixArith5(a2,ca2,u3,cu3,"Square/UpperTri 16");
80     TestMatrixArith5(a1,ca1,u6,cu6,"Square/UpperTri 17");
81     TestMatrixArith5(a2,ca2,u6,cu6,"Square/UpperTri 18");
82 #endif
83 
84     tmv::LowerTriMatrixView<T> l1 = a1x.lowerTri();
85     tmv::LowerTriMatrixView<CT> cl1 = ca1x.lowerTri();
86     tmv::LowerTriMatrixView<T> l2 = a2x.lowerTri();
87     tmv::LowerTriMatrixView<CT> cl2 = ca2x.lowerTri();
88     tmv::LowerTriMatrixView<T> l4 = a1x.unitLowerTri();
89     tmv::LowerTriMatrixView<CT> cl4 = ca1x.unitLowerTri();
90     tmv::LowerTriMatrixView<T> l5 = a2x.unitLowerTri();
91     tmv::LowerTriMatrixView<CT> cl5 = ca2x.unitLowerTri();
92 
93     TestMatrixArith5(a1,ca1,l1,cl1,"Square/LowerTri 1");
94     TestMatrixArith5(a1,ca1,l2,cl2,"Square/LowerTri 2");
95     TestMatrixArith5(a1,ca1,l4,cl4,"Square/LowerTri 3");
96     TestMatrixArith5(a1,ca1,l5,cl5,"Square/LowerTri 4");
97 #if (XTEST & 2)
98     TestMatrixArith5(a2,ca2,l1,cl1,"Square/LowerTri 5");
99     TestMatrixArith5(a2,ca2,l2,cl2,"Square/LowerTri 6");
100     TestMatrixArith5(a2,ca2,l4,cl4,"Square/LowerTri 7");
101     TestMatrixArith5(a2,ca2,l5,cl5,"Square/LowerTri 8");
102 #endif
103 #if (XTEST & 1)
104     tmv::LowerTriMatrixView<T> l3 = a3x.subMatrix(0,12,0,16,3,4).lowerTri();
105     tmv::LowerTriMatrixView<CT> cl3 = ca3x.subMatrix(0,12,0,16,3,4).lowerTri();
106     tmv::LowerTriMatrixView<T> l6 = a3x.subMatrix(0,12,0,16,3,4).unitLowerTri();
107     tmv::LowerTriMatrixView<CT> cl6 = ca3x.subMatrix(0,12,0,16,3,4).unitLowerTri();
108     TestMatrixArith5(a3,ca3,l1,cl1,"Square/LowerTri 9");
109     TestMatrixArith5(a3,ca3,l2,cl2,"Square/LowerTri 10");
110     TestMatrixArith5(a3,ca3,l3,cl3,"Square/LowerTri 11");
111     TestMatrixArith5(a3,ca3,l4,cl4,"Square/LowerTri 12");
112     TestMatrixArith5(a3,ca3,l5,cl5,"Square/LowerTri 13");
113     TestMatrixArith5(a3,ca3,l6,cl6,"Square/LowerTri 14");
114     TestMatrixArith5(a1,ca1,l3,cl3,"Square/LowerTri 15");
115     TestMatrixArith5(a2,ca2,l3,cl3,"Square/LowerTri 16");
116     TestMatrixArith5(a1,ca1,l6,cl6,"Square/LowerTri 17");
117     TestMatrixArith5(a2,ca2,l6,cl6,"Square/LowerTri 18");
118 #endif
119 
120     tmv::Matrix<T,tmv::RowMajor> a4x(6,4);
121     for(int i=0;i<6;++i) for(int j=0;j<4;++j) {
122         a4x(i,j) = T(2+4*i-5*j);
123     }
124     a4x.rowRange(0,4) += a1x;
125 
126     tmv::Matrix<CT,tmv::RowMajor> ca4x = CT(1,2) * a4x;
127     ca4x.rowRange(0,4) += ca1x;
128 
129     tmv::Matrix<T,tmv::ColMajor> a5x = a4x;
130     tmv::Matrix<CT,tmv::ColMajor> ca5x = ca4x;
131 
132     tmv::MatrixView<T> a4 = a4x.view();
133     tmv::MatrixView<CT> ca4 = ca4x.view();
134     tmv::MatrixView<T> a5 = a5x.view();
135     tmv::MatrixView<CT> ca5 = ca5x.view();
136 
137     TestMatrixArith5(a4,ca4,u1,cu1,"NonSquare/UpperTri 1");
138     TestMatrixArith5(a4,ca4,u2,cu2,"NonSquare/UpperTri 2");
139     TestMatrixArith5(a4,ca4,u4,cu4,"NonSquare/UpperTri 3");
140     TestMatrixArith5(a4,ca4,u5,cu5,"NonSquare/UpperTri 4");
141     TestMatrixArith5(a5,ca5,u1,cu1,"NonSquare/UpperTri 5");
142 #if (XTEST & 2)
143     TestMatrixArith5(a5,ca5,u2,cu2,"NonSquare/UpperTri 6");
144     TestMatrixArith5(a5,ca5,u4,cu4,"NonSquare/UpperTri 7");
145     TestMatrixArith5(a5,ca5,u5,cu5,"NonSquare/UpperTri 8");
146 #endif
147 #if (XTEST & 1)
148     TestMatrixArith5(a4,ca4,u3,cu3,"NonSquare/UpperTri 9");
149     TestMatrixArith5(a5,ca5,u3,cu3,"NonSquare/UpperTri 10");
150     TestMatrixArith5(a4,ca4,u6,cu6,"NonSquare/UpperTri 11");
151     TestMatrixArith5(a5,ca5,u6,cu6,"NonSquare/UpperTri 12");
152 #endif
153 
154     TestMatrixArith5(a4,ca4,l1,cl1,"NonSquare/LowerTri 1");
155     TestMatrixArith5(a4,ca4,l2,cl2,"NonSquare/LowerTri 2");
156     TestMatrixArith5(a4,ca4,l4,cl4,"NonSquare/LowerTri 3");
157     TestMatrixArith5(a4,ca4,l5,cl5,"NonSquare/LowerTri 4");
158 #if (XTEST & 2)
159     TestMatrixArith5(a5,ca5,l1,cl1,"NonSquare/LowerTri 5");
160     TestMatrixArith5(a5,ca5,l2,cl2,"NonSquare/LowerTri 6");
161     TestMatrixArith5(a5,ca5,l4,cl4,"NonSquare/LowerTri 7");
162     TestMatrixArith5(a5,ca5,l5,cl5,"NonSquare/LowerTri 8");
163 #endif
164 #if (XTEST & 1)
165     TestMatrixArith5(a4,ca4,l3,cl3,"NonSquare/LowerTri 9");
166     TestMatrixArith5(a5,ca5,l3,cl3,"NonSquare/LowerTri 10");
167     TestMatrixArith5(a4,ca4,l6,cl6,"NonSquare/LowerTri 11");
168     TestMatrixArith5(a5,ca5,l6,cl6,"NonSquare/LowerTri 12");
169 #endif
170 
171 #if (XTEST & 8)
172     tmv::Matrix<T> a6x(0,4);
173     tmv::Matrix<CT> ca6x(0,4);
174 
175     tmv::MatrixView<T> a6 = a6x.view();
176     tmv::MatrixView<CT> ca6 = ca6x.view();
177 
178     TestMatrixArith5(a6,ca6,u1,cu1,"Degenerate/UpperTri 1");
179     TestMatrixArith5(a6,ca6,u2,cu2,"Degenerate/UpperTri 2");
180     TestMatrixArith5(a6,ca6,u4,cu4,"Degenerate/UpperTri 3");
181     TestMatrixArith5(a6,ca6,u5,cu5,"Degenerate/UpperTri 4");
182 #if (XTEST & 1)
183     TestMatrixArith5(a6,ca6,u3,cu3,"Degenerate/UpperTri 5");
184     TestMatrixArith5(a6,ca6,u6,cu6,"Degenerate/UpperTri 6");
185 #endif
186 
187 #if (XTEST & 2)
188     TestMatrixArith5(a6,ca6,l1,cl1,"Degenerate/LowerTri 1");
189     TestMatrixArith5(a6,ca6,l2,cl2,"Degenerate/LowerTri 2");
190     TestMatrixArith5(a6,ca6,l4,cl4,"Degenerate/LowerTri 3");
191     TestMatrixArith5(a6,ca6,l5,cl5,"Degenerate/LowerTri 4");
192 #endif
193 #if (XTEST & 1)
194     TestMatrixArith5(a6,ca6,l3,cl3,"Degenerate/LowerTri 5");
195     TestMatrixArith5(a6,ca6,l6,cl6,"Degenerate/LowerTri 6");
196 #endif
197 #endif
198 }
199 
200 #ifdef TEST_DOUBLE
201 template void TestTriMatrixArith_B5a<double>();
202 #endif
203 #ifdef TEST_FLOAT
204 template void TestTriMatrixArith_B5a<float>();
205 #endif
206 #ifdef TEST_LONGDOUBLE
207 template void TestTriMatrixArith_B5a<long double>();
208 #endif
209 #ifdef TEST_INT
210 template void TestTriMatrixArith_B5a<int>();
211 #endif
212