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_B4a()9 template <class T> void TestTriMatrixArith_B4a()
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     tmv::UpperTriMatrixView<T> u4 = a1x.unitUpperTri();
42     tmv::UpperTriMatrixView<CT> cu4 = ca1x.unitUpperTri();
43     tmv::UpperTriMatrixView<T> u5 = a2x.unitUpperTri();
44     tmv::UpperTriMatrixView<CT> cu5 = ca2x.unitUpperTri();
45 
46     tmv::MatrixView<T> a1 = a1x.view();
47     tmv::MatrixView<CT> ca1 = ca1x.view();
48     tmv::MatrixView<T> a2 = a2x.view();
49     tmv::MatrixView<CT> ca2 = ca2x.view();
50 
51     TestMatrixArith4(a1,ca1,u1,cu1,"Square/UpperTri 1");
52     TestMatrixArith4(a1,ca1,u2,cu2,"Square/UpperTri 2");
53     TestMatrixArith4(a1,ca1,u4,cu4,"Square/UpperTri 3");
54     TestMatrixArith4(a1,ca1,u5,cu5,"Square/UpperTri 4");
55     TestMatrixArith4(a2,ca2,u1,cu1,"Square/UpperTri 5");
56 #if (XTEST & 2)
57     TestMatrixArith4(a2,ca2,u2,cu2,"Square/UpperTri 6");
58     TestMatrixArith4(a2,ca2,u4,cu4,"Square/UpperTri 7");
59     TestMatrixArith4(a2,ca2,u5,cu5,"Square/UpperTri 8");
60 #endif
61 #if (XTEST & 1)
62     tmv::Matrix<T> a3x(12,16);
63     for(int i=0;i<12;++i) for(int j=0;j<16;++j) a3x(i,j) = T(1-2*i+3*j);
64     a3x.diag().addToAll(30);
65     tmv::Matrix<CT> ca3x = a3x*CT(1,-2);
66     ca3x.diag().addToAll(CT(-22,15));
67 
68     tmv::UpperTriMatrixView<T> u3 = a3x.subMatrix(0,12,0,16,3,4).upperTri();
69     tmv::UpperTriMatrixView<CT> cu3 = ca3x.subMatrix(0,12,0,16,3,4).upperTri();
70     tmv::UpperTriMatrixView<T> u6 = a3x.subMatrix(0,12,0,16,3,4).unitUpperTri();
71     tmv::UpperTriMatrixView<CT> cu6 = ca3x.subMatrix(0,12,0,16,3,4).unitUpperTri();
72     tmv::MatrixView<T> a3 = a3x.view();
73     tmv::MatrixView<CT> ca3 = ca3x.view();
74     TestMatrixArith4(a3,ca3,u1,cu1,"Square/UpperTri 9");
75     TestMatrixArith4(a3,ca3,u2,cu2,"Square/UpperTri 10");
76     TestMatrixArith4(a3,ca3,u3,cu3,"Square/UpperTri 11");
77     TestMatrixArith4(a3,ca3,u4,cu4,"Square/UpperTri 12");
78     TestMatrixArith4(a3,ca3,u5,cu5,"Square/UpperTri 13");
79     TestMatrixArith4(a3,ca3,u6,cu6,"Square/UpperTri 14");
80     TestMatrixArith4(a1,ca1,u3,cu3,"Square/UpperTri 15");
81     TestMatrixArith4(a2,ca2,u3,cu3,"Square/UpperTri 16");
82     TestMatrixArith4(a1,ca1,u6,cu6,"Square/UpperTri 17");
83     TestMatrixArith4(a2,ca2,u6,cu6,"Square/UpperTri 18");
84 #endif
85 
86     tmv::LowerTriMatrixView<T> l1 = a1x.lowerTri();
87     tmv::LowerTriMatrixView<CT> cl1 = ca1x.lowerTri();
88     tmv::LowerTriMatrixView<T> l2 = a2x.lowerTri();
89     tmv::LowerTriMatrixView<CT> cl2 = ca2x.lowerTri();
90     tmv::LowerTriMatrixView<T> l4 = a1x.unitLowerTri();
91     tmv::LowerTriMatrixView<CT> cl4 = ca1x.unitLowerTri();
92     tmv::LowerTriMatrixView<T> l5 = a2x.unitLowerTri();
93     tmv::LowerTriMatrixView<CT> cl5 = ca2x.unitLowerTri();
94 
95     TestMatrixArith4(a1,ca1,l1,cl1,"Square/LowerTri 1");
96     TestMatrixArith4(a1,ca1,l2,cl2,"Square/LowerTri 2");
97     TestMatrixArith4(a1,ca1,l4,cl4,"Square/LowerTri 3");
98     TestMatrixArith4(a1,ca1,l5,cl5,"Square/LowerTri 4");
99 #if (XTEST & 2)
100     TestMatrixArith4(a2,ca2,l1,cl1,"Square/LowerTri 5");
101     TestMatrixArith4(a2,ca2,l2,cl2,"Square/LowerTri 6");
102     TestMatrixArith4(a2,ca2,l4,cl4,"Square/LowerTri 7");
103     TestMatrixArith4(a2,ca2,l5,cl5,"Square/LowerTri 8");
104 #endif
105 #if (XTEST & 1)
106     tmv::LowerTriMatrixView<T> l3 = a3x.subMatrix(0,12,0,16,3,4).lowerTri();
107     tmv::LowerTriMatrixView<CT> cl3 = ca3x.subMatrix(0,12,0,16,3,4).lowerTri();
108     tmv::LowerTriMatrixView<T> l6 = a3x.subMatrix(0,12,0,16,3,4).unitLowerTri();
109     tmv::LowerTriMatrixView<CT> cl6 = ca3x.subMatrix(0,12,0,16,3,4).unitLowerTri();
110     TestMatrixArith4(a3,ca3,l1,cl1,"Square/LowerTri 9");
111     TestMatrixArith4(a3,ca3,l2,cl2,"Square/LowerTri 10");
112     TestMatrixArith4(a3,ca3,l3,cl3,"Square/LowerTri 11");
113     TestMatrixArith4(a3,ca3,l4,cl4,"Square/LowerTri 12");
114     TestMatrixArith4(a3,ca3,l5,cl5,"Square/LowerTri 13");
115     TestMatrixArith4(a3,ca3,l6,cl6,"Square/LowerTri 14");
116     TestMatrixArith4(a1,ca1,l3,cl3,"Square/LowerTri 15");
117     TestMatrixArith4(a2,ca2,l3,cl3,"Square/LowerTri 16");
118     TestMatrixArith4(a1,ca1,l6,cl6,"Square/LowerTri 17");
119     TestMatrixArith4(a2,ca2,l6,cl6,"Square/LowerTri 18");
120 #endif
121 }
122 
123 #ifdef TEST_DOUBLE
124 template void TestTriMatrixArith_B4a<double>();
125 #endif
126 #ifdef TEST_FLOAT
127 template void TestTriMatrixArith_B4a<float>();
128 #endif
129 #ifdef TEST_LONGDOUBLE
130 template void TestTriMatrixArith_B4a<long double>();
131 #endif
132 #ifdef TEST_INT
133 template void TestTriMatrixArith_B4a<int>();
134 #endif
135