1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUMATRIX_HPP
2*35238bceSAndroid Build Coastguard Worker #define _TCUMATRIX_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core
5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Templatized matrix class.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuArray.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker namespace tcu
31*35238bceSAndroid Build Coastguard Worker {
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker // Templated matrix class.
34*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
35*35238bceSAndroid Build Coastguard Worker class Matrix
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker public:
38*35238bceSAndroid Build Coastguard Worker typedef Vector<T, Rows> Element;
39*35238bceSAndroid Build Coastguard Worker typedef T Scalar;
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker enum
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker SIZE = Cols,
44*35238bceSAndroid Build Coastguard Worker ROWS = Rows,
45*35238bceSAndroid Build Coastguard Worker COLS = Cols,
46*35238bceSAndroid Build Coastguard Worker };
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker Matrix(void);
49*35238bceSAndroid Build Coastguard Worker explicit Matrix(const T &src);
50*35238bceSAndroid Build Coastguard Worker explicit Matrix(const T src[Rows * Cols]);
51*35238bceSAndroid Build Coastguard Worker Matrix(const Vector<T, Rows> &src);
52*35238bceSAndroid Build Coastguard Worker Matrix(const Matrix<T, Rows, Cols> &src);
53*35238bceSAndroid Build Coastguard Worker ~Matrix(void);
54*35238bceSAndroid Build Coastguard Worker
55*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> &operator=(const Matrix<T, Rows, Cols> &src);
56*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> &operator*=(const Matrix<T, Rows, Cols> &src);
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker void setRow(int rowNdx, const Vector<T, Cols> &vec);
59*35238bceSAndroid Build Coastguard Worker void setColumn(int colNdx, const Vector<T, Rows> &vec);
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker Vector<T, Cols> getRow(int ndx) const;
62*35238bceSAndroid Build Coastguard Worker Vector<T, Rows> &getColumn(int ndx);
63*35238bceSAndroid Build Coastguard Worker const Vector<T, Rows> &getColumn(int ndx) const;
64*35238bceSAndroid Build Coastguard Worker
operator [](int ndx)65*35238bceSAndroid Build Coastguard Worker Vector<T, Rows> &operator[](int ndx)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker return getColumn(ndx);
68*35238bceSAndroid Build Coastguard Worker }
operator [](int ndx) const69*35238bceSAndroid Build Coastguard Worker const Vector<T, Rows> &operator[](int ndx) const
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker return getColumn(ndx);
72*35238bceSAndroid Build Coastguard Worker }
73*35238bceSAndroid Build Coastguard Worker
operator ()(int row,int col) const74*35238bceSAndroid Build Coastguard Worker inline const T &operator()(int row, int col) const
75*35238bceSAndroid Build Coastguard Worker {
76*35238bceSAndroid Build Coastguard Worker return m_data[col][row];
77*35238bceSAndroid Build Coastguard Worker }
operator ()(int row,int col)78*35238bceSAndroid Build Coastguard Worker inline T &operator()(int row, int col)
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker return m_data[col][row];
81*35238bceSAndroid Build Coastguard Worker }
82*35238bceSAndroid Build Coastguard Worker
83*35238bceSAndroid Build Coastguard Worker Array<T, Rows * Cols> getRowMajorData(void) const;
84*35238bceSAndroid Build Coastguard Worker Array<T, Rows * Cols> getColumnMajorData(void) const;
85*35238bceSAndroid Build Coastguard Worker
86*35238bceSAndroid Build Coastguard Worker private:
87*35238bceSAndroid Build Coastguard Worker Vector<Vector<T, Rows>, Cols> m_data;
88*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker // Operators.
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker // Mat * Mat.
93*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows0, int Cols0, int Rows1, int Cols1>
94*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows0, Cols1> operator*(const Matrix<T, Rows0, Cols0> &a, const Matrix<T, Rows1, Cols1> &b);
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker // Mat * Vec (column vector).
97*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
98*35238bceSAndroid Build Coastguard Worker Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &mtx, const Vector<T, Cols> &vec);
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker // Vec * Mat (row vector).
101*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
102*35238bceSAndroid Build Coastguard Worker Vector<T, Cols> operator*(const Vector<T, Rows> &vec, const Matrix<T, Rows, Cols> &mtx);
103*35238bceSAndroid Build Coastguard Worker
104*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
105*35238bceSAndroid Build Coastguard Worker bool operator==(const Matrix<T, Rows, Cols> &lhs, const Matrix<T, Rows, Cols> &rhs);
106*35238bceSAndroid Build Coastguard Worker
107*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
108*35238bceSAndroid Build Coastguard Worker bool operator!=(const Matrix<T, Rows, Cols> &lhs, const Matrix<T, Rows, Cols> &rhs);
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Worker // Further operations
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
113*35238bceSAndroid Build Coastguard Worker struct SquareMatrixOps
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker static T doDeterminant(const Matrix<T, Size, Size> &mat);
116*35238bceSAndroid Build Coastguard Worker static Matrix<T, Size, Size> doInverse(const Matrix<T, Size, Size> &mat);
117*35238bceSAndroid Build Coastguard Worker };
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Worker template <typename T>
120*35238bceSAndroid Build Coastguard Worker struct SquareMatrixOps<T, 2>
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker static T doDeterminant(const Matrix<T, 2, 2> &mat);
123*35238bceSAndroid Build Coastguard Worker static Matrix<T, 2, 2> doInverse(const Matrix<T, 2, 2> &mat);
124*35238bceSAndroid Build Coastguard Worker };
125*35238bceSAndroid Build Coastguard Worker
126*35238bceSAndroid Build Coastguard Worker template <typename T>
127*35238bceSAndroid Build Coastguard Worker struct SquareMatrixOps<T, 3>
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker static T doDeterminant(const Matrix<T, 3, 3> &mat);
130*35238bceSAndroid Build Coastguard Worker static Matrix<T, 3, 3> doInverse(const Matrix<T, 3, 3> &mat);
131*35238bceSAndroid Build Coastguard Worker };
132*35238bceSAndroid Build Coastguard Worker
133*35238bceSAndroid Build Coastguard Worker template <typename T>
134*35238bceSAndroid Build Coastguard Worker struct SquareMatrixOps<T, 4>
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker static T doDeterminant(const Matrix<T, 4, 4> &mat);
137*35238bceSAndroid Build Coastguard Worker static Matrix<T, 4, 4> doInverse(const Matrix<T, 4, 4> &mat);
138*35238bceSAndroid Build Coastguard Worker };
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker namespace matrix
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
determinant(const Matrix<T,Size,Size> & mat)144*35238bceSAndroid Build Coastguard Worker T determinant(const Matrix<T, Size, Size> &mat)
145*35238bceSAndroid Build Coastguard Worker {
146*35238bceSAndroid Build Coastguard Worker return SquareMatrixOps<T, Size>::doDeterminant(mat);
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
inverse(const Matrix<T,Size,Size> & mat)150*35238bceSAndroid Build Coastguard Worker Matrix<T, Size, Size> inverse(const Matrix<T, Size, Size> &mat)
151*35238bceSAndroid Build Coastguard Worker {
152*35238bceSAndroid Build Coastguard Worker return SquareMatrixOps<T, Size>::doInverse(mat);
153*35238bceSAndroid Build Coastguard Worker }
154*35238bceSAndroid Build Coastguard Worker
155*35238bceSAndroid Build Coastguard Worker } // namespace matrix
156*35238bceSAndroid Build Coastguard Worker
157*35238bceSAndroid Build Coastguard Worker // Template implementations.
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker template <typename T>
doDeterminant(const Matrix<T,2,2> & mat)160*35238bceSAndroid Build Coastguard Worker T SquareMatrixOps<T, 2>::doDeterminant(const Matrix<T, 2, 2> &mat)
161*35238bceSAndroid Build Coastguard Worker {
162*35238bceSAndroid Build Coastguard Worker return mat(0, 0) * mat(1, 1) - mat(1, 0) * mat(0, 1);
163*35238bceSAndroid Build Coastguard Worker }
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker template <typename T>
doDeterminant(const Matrix<T,3,3> & mat)166*35238bceSAndroid Build Coastguard Worker T SquareMatrixOps<T, 3>::doDeterminant(const Matrix<T, 3, 3> &mat)
167*35238bceSAndroid Build Coastguard Worker {
168*35238bceSAndroid Build Coastguard Worker return +mat(0, 0) * mat(1, 1) * mat(2, 2) + mat(0, 1) * mat(1, 2) * mat(2, 0) + mat(0, 2) * mat(1, 0) * mat(2, 1) -
169*35238bceSAndroid Build Coastguard Worker mat(0, 0) * mat(1, 2) * mat(2, 1) - mat(0, 1) * mat(1, 0) * mat(2, 2) - mat(0, 2) * mat(1, 1) * mat(2, 0);
170*35238bceSAndroid Build Coastguard Worker }
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker template <typename T>
doDeterminant(const Matrix<T,4,4> & mat)173*35238bceSAndroid Build Coastguard Worker T SquareMatrixOps<T, 4>::doDeterminant(const Matrix<T, 4, 4> &mat)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker using matrix::determinant;
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker const T minorMatrices[4][3 * 3] = {{
178*35238bceSAndroid Build Coastguard Worker mat(1, 1),
179*35238bceSAndroid Build Coastguard Worker mat(2, 1),
180*35238bceSAndroid Build Coastguard Worker mat(3, 1),
181*35238bceSAndroid Build Coastguard Worker mat(1, 2),
182*35238bceSAndroid Build Coastguard Worker mat(2, 2),
183*35238bceSAndroid Build Coastguard Worker mat(3, 2),
184*35238bceSAndroid Build Coastguard Worker mat(1, 3),
185*35238bceSAndroid Build Coastguard Worker mat(2, 3),
186*35238bceSAndroid Build Coastguard Worker mat(3, 3),
187*35238bceSAndroid Build Coastguard Worker },
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker mat(1, 0),
190*35238bceSAndroid Build Coastguard Worker mat(2, 0),
191*35238bceSAndroid Build Coastguard Worker mat(3, 0),
192*35238bceSAndroid Build Coastguard Worker mat(1, 2),
193*35238bceSAndroid Build Coastguard Worker mat(2, 2),
194*35238bceSAndroid Build Coastguard Worker mat(3, 2),
195*35238bceSAndroid Build Coastguard Worker mat(1, 3),
196*35238bceSAndroid Build Coastguard Worker mat(2, 3),
197*35238bceSAndroid Build Coastguard Worker mat(3, 3),
198*35238bceSAndroid Build Coastguard Worker },
199*35238bceSAndroid Build Coastguard Worker {
200*35238bceSAndroid Build Coastguard Worker mat(1, 0),
201*35238bceSAndroid Build Coastguard Worker mat(2, 0),
202*35238bceSAndroid Build Coastguard Worker mat(3, 0),
203*35238bceSAndroid Build Coastguard Worker mat(1, 1),
204*35238bceSAndroid Build Coastguard Worker mat(2, 1),
205*35238bceSAndroid Build Coastguard Worker mat(3, 1),
206*35238bceSAndroid Build Coastguard Worker mat(1, 3),
207*35238bceSAndroid Build Coastguard Worker mat(2, 3),
208*35238bceSAndroid Build Coastguard Worker mat(3, 3),
209*35238bceSAndroid Build Coastguard Worker },
210*35238bceSAndroid Build Coastguard Worker {
211*35238bceSAndroid Build Coastguard Worker mat(1, 0),
212*35238bceSAndroid Build Coastguard Worker mat(2, 0),
213*35238bceSAndroid Build Coastguard Worker mat(3, 0),
214*35238bceSAndroid Build Coastguard Worker mat(1, 1),
215*35238bceSAndroid Build Coastguard Worker mat(2, 1),
216*35238bceSAndroid Build Coastguard Worker mat(3, 1),
217*35238bceSAndroid Build Coastguard Worker mat(1, 2),
218*35238bceSAndroid Build Coastguard Worker mat(2, 2),
219*35238bceSAndroid Build Coastguard Worker mat(3, 2),
220*35238bceSAndroid Build Coastguard Worker }};
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Worker return +mat(0, 0) * determinant(Matrix<T, 3, 3>(minorMatrices[0])) -
223*35238bceSAndroid Build Coastguard Worker mat(0, 1) * determinant(Matrix<T, 3, 3>(minorMatrices[1])) +
224*35238bceSAndroid Build Coastguard Worker mat(0, 2) * determinant(Matrix<T, 3, 3>(minorMatrices[2])) -
225*35238bceSAndroid Build Coastguard Worker mat(0, 3) * determinant(Matrix<T, 3, 3>(minorMatrices[3]));
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker
228*35238bceSAndroid Build Coastguard Worker template <typename T>
doInverse(const Matrix<T,2,2> & mat)229*35238bceSAndroid Build Coastguard Worker Matrix<T, 2, 2> SquareMatrixOps<T, 2>::doInverse(const Matrix<T, 2, 2> &mat)
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker using matrix::determinant;
232*35238bceSAndroid Build Coastguard Worker
233*35238bceSAndroid Build Coastguard Worker const T det = determinant(mat);
234*35238bceSAndroid Build Coastguard Worker Matrix<T, 2, 2> retVal;
235*35238bceSAndroid Build Coastguard Worker
236*35238bceSAndroid Build Coastguard Worker retVal(0, 0) = mat(1, 1) / det;
237*35238bceSAndroid Build Coastguard Worker retVal(0, 1) = -mat(0, 1) / det;
238*35238bceSAndroid Build Coastguard Worker retVal(1, 0) = -mat(1, 0) / det;
239*35238bceSAndroid Build Coastguard Worker retVal(1, 1) = mat(0, 0) / det;
240*35238bceSAndroid Build Coastguard Worker
241*35238bceSAndroid Build Coastguard Worker return retVal;
242*35238bceSAndroid Build Coastguard Worker }
243*35238bceSAndroid Build Coastguard Worker
244*35238bceSAndroid Build Coastguard Worker template <typename T>
doInverse(const Matrix<T,3,3> & mat)245*35238bceSAndroid Build Coastguard Worker Matrix<T, 3, 3> SquareMatrixOps<T, 3>::doInverse(const Matrix<T, 3, 3> &mat)
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker // Blockwise inversion
248*35238bceSAndroid Build Coastguard Worker using matrix::inverse;
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker const T areaA[2 * 2] = {mat(0, 0), mat(0, 1), mat(1, 0), mat(1, 1)};
251*35238bceSAndroid Build Coastguard Worker const T areaB[2] = {
252*35238bceSAndroid Build Coastguard Worker mat(0, 2),
253*35238bceSAndroid Build Coastguard Worker mat(1, 2),
254*35238bceSAndroid Build Coastguard Worker };
255*35238bceSAndroid Build Coastguard Worker const T areaC[2] = {
256*35238bceSAndroid Build Coastguard Worker mat(2, 0),
257*35238bceSAndroid Build Coastguard Worker mat(2, 1),
258*35238bceSAndroid Build Coastguard Worker };
259*35238bceSAndroid Build Coastguard Worker const T areaD[1] = {mat(2, 2)};
260*35238bceSAndroid Build Coastguard Worker const T nullField[4] = {T(0.0f)};
261*35238bceSAndroid Build Coastguard Worker
262*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> invA = inverse(Matrix<T, 2, 2>(areaA));
263*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 1> matB = Matrix<T, 2, 1>(areaB);
264*35238bceSAndroid Build Coastguard Worker const Matrix<T, 1, 2> matC = Matrix<T, 1, 2>(areaC);
265*35238bceSAndroid Build Coastguard Worker const Matrix<T, 1, 1> matD = Matrix<T, 1, 1>(areaD);
266*35238bceSAndroid Build Coastguard Worker
267*35238bceSAndroid Build Coastguard Worker const T schurComplement = T(1.0f) / (matD - matC * invA * matB)(0, 0);
268*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> zeroMat = Matrix<T, 2, 2>(nullField);
269*35238bceSAndroid Build Coastguard Worker
270*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> blockA = invA + invA * matB * schurComplement * matC * invA;
271*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 1> blockB = (zeroMat - invA) * matB * schurComplement;
272*35238bceSAndroid Build Coastguard Worker const Matrix<T, 1, 2> blockC = matC * invA * (-schurComplement);
273*35238bceSAndroid Build Coastguard Worker const T blockD = schurComplement;
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker const T result[3 * 3] = {
276*35238bceSAndroid Build Coastguard Worker blockA(0, 0), blockA(0, 1), blockB(0, 0), blockA(1, 0), blockA(1, 1),
277*35238bceSAndroid Build Coastguard Worker blockB(1, 0), blockC(0, 0), blockC(0, 1), blockD,
278*35238bceSAndroid Build Coastguard Worker };
279*35238bceSAndroid Build Coastguard Worker
280*35238bceSAndroid Build Coastguard Worker return Matrix<T, 3, 3>(result);
281*35238bceSAndroid Build Coastguard Worker }
282*35238bceSAndroid Build Coastguard Worker
283*35238bceSAndroid Build Coastguard Worker template <typename T>
doInverse(const Matrix<T,4,4> & mat)284*35238bceSAndroid Build Coastguard Worker Matrix<T, 4, 4> SquareMatrixOps<T, 4>::doInverse(const Matrix<T, 4, 4> &mat)
285*35238bceSAndroid Build Coastguard Worker {
286*35238bceSAndroid Build Coastguard Worker // Blockwise inversion
287*35238bceSAndroid Build Coastguard Worker using matrix::inverse;
288*35238bceSAndroid Build Coastguard Worker
289*35238bceSAndroid Build Coastguard Worker const T areaA[2 * 2] = {mat(0, 0), mat(0, 1), mat(1, 0), mat(1, 1)};
290*35238bceSAndroid Build Coastguard Worker const T areaB[2 * 2] = {mat(0, 2), mat(0, 3), mat(1, 2), mat(1, 3)};
291*35238bceSAndroid Build Coastguard Worker const T areaC[2 * 2] = {mat(2, 0), mat(2, 1), mat(3, 0), mat(3, 1)};
292*35238bceSAndroid Build Coastguard Worker const T areaD[2 * 2] = {mat(2, 2), mat(2, 3), mat(3, 2), mat(3, 3)};
293*35238bceSAndroid Build Coastguard Worker const T nullField[4] = {T(0.0f)};
294*35238bceSAndroid Build Coastguard Worker
295*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> invA = inverse(Matrix<T, 2, 2>(areaA));
296*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> matB = Matrix<T, 2, 2>(areaB);
297*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> matC = Matrix<T, 2, 2>(areaC);
298*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> matD = Matrix<T, 2, 2>(areaD);
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> schurComplement = inverse(matD - matC * invA * matB);
301*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> zeroMat = Matrix<T, 2, 2>(nullField);
302*35238bceSAndroid Build Coastguard Worker
303*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> blockA = invA + invA * matB * schurComplement * matC * invA;
304*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> blockB = (zeroMat - invA) * matB * schurComplement;
305*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> blockC = (zeroMat - schurComplement) * matC * invA;
306*35238bceSAndroid Build Coastguard Worker const Matrix<T, 2, 2> blockD = schurComplement;
307*35238bceSAndroid Build Coastguard Worker
308*35238bceSAndroid Build Coastguard Worker const T result[4 * 4] = {
309*35238bceSAndroid Build Coastguard Worker blockA(0, 0), blockA(0, 1), blockB(0, 0), blockB(0, 1), blockA(1, 0), blockA(1, 1), blockB(1, 0), blockB(1, 1),
310*35238bceSAndroid Build Coastguard Worker blockC(0, 0), blockC(0, 1), blockD(0, 0), blockD(0, 1), blockC(1, 0), blockC(1, 1), blockD(1, 0), blockD(1, 1),
311*35238bceSAndroid Build Coastguard Worker };
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Worker return Matrix<T, 4, 4>(result);
314*35238bceSAndroid Build Coastguard Worker }
315*35238bceSAndroid Build Coastguard Worker
316*35238bceSAndroid Build Coastguard Worker // Initialize to identity.
317*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
Matrix(void)318*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols>::Matrix(void)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
321*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
322*35238bceSAndroid Build Coastguard Worker (*this)(row, col) = (row == col) ? T(1) : T(0);
323*35238bceSAndroid Build Coastguard Worker }
324*35238bceSAndroid Build Coastguard Worker
325*35238bceSAndroid Build Coastguard Worker // Initialize to diagonal matrix.
326*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
Matrix(const T & src)327*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols>::Matrix(const T &src)
328*35238bceSAndroid Build Coastguard Worker {
329*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
330*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
331*35238bceSAndroid Build Coastguard Worker (*this)(row, col) = (row == col) ? src : T(0);
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker // Initialize from data array.
335*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
Matrix(const T src[Rows * Cols])336*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols>::Matrix(const T src[Rows * Cols])
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
339*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
340*35238bceSAndroid Build Coastguard Worker (*this)(row, col) = src[row * Cols + col];
341*35238bceSAndroid Build Coastguard Worker }
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker // Initialize to diagonal matrix.
344*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
Matrix(const Vector<T,Rows> & src)345*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols>::Matrix(const Vector<T, Rows> &src)
346*35238bceSAndroid Build Coastguard Worker {
347*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Rows == Cols);
348*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
349*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
350*35238bceSAndroid Build Coastguard Worker (*this)(row, col) = (row == col) ? src.m_data[row] : T(0);
351*35238bceSAndroid Build Coastguard Worker }
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker // Copy constructor.
354*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
Matrix(const Matrix<T,Rows,Cols> & src)355*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols>::Matrix(const Matrix<T, Rows, Cols> &src)
356*35238bceSAndroid Build Coastguard Worker {
357*35238bceSAndroid Build Coastguard Worker *this = src;
358*35238bceSAndroid Build Coastguard Worker }
359*35238bceSAndroid Build Coastguard Worker
360*35238bceSAndroid Build Coastguard Worker // Destructor.
361*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
~Matrix(void)362*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols>::~Matrix(void)
363*35238bceSAndroid Build Coastguard Worker {
364*35238bceSAndroid Build Coastguard Worker }
365*35238bceSAndroid Build Coastguard Worker
366*35238bceSAndroid Build Coastguard Worker // Assignment operator.
367*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator =(const Matrix<T,Rows,Cols> & src)368*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> &Matrix<T, Rows, Cols>::operator=(const Matrix<T, Rows, Cols> &src)
369*35238bceSAndroid Build Coastguard Worker {
370*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
371*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
372*35238bceSAndroid Build Coastguard Worker (*this)(row, col) = src(row, col);
373*35238bceSAndroid Build Coastguard Worker return *this;
374*35238bceSAndroid Build Coastguard Worker }
375*35238bceSAndroid Build Coastguard Worker
376*35238bceSAndroid Build Coastguard Worker // Multipy and assign op
377*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator *=(const Matrix<T,Rows,Cols> & src)378*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> &Matrix<T, Rows, Cols>::operator*=(const Matrix<T, Rows, Cols> &src)
379*35238bceSAndroid Build Coastguard Worker {
380*35238bceSAndroid Build Coastguard Worker *this = *this * src;
381*35238bceSAndroid Build Coastguard Worker return *this;
382*35238bceSAndroid Build Coastguard Worker }
383*35238bceSAndroid Build Coastguard Worker
384*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
setRow(int rowNdx,const Vector<T,Cols> & vec)385*35238bceSAndroid Build Coastguard Worker void Matrix<T, Rows, Cols>::setRow(int rowNdx, const Vector<T, Cols> &vec)
386*35238bceSAndroid Build Coastguard Worker {
387*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
388*35238bceSAndroid Build Coastguard Worker (*this)(rowNdx, col) = vec.m_data[col];
389*35238bceSAndroid Build Coastguard Worker }
390*35238bceSAndroid Build Coastguard Worker
391*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
setColumn(int colNdx,const Vector<T,Rows> & vec)392*35238bceSAndroid Build Coastguard Worker void Matrix<T, Rows, Cols>::setColumn(int colNdx, const Vector<T, Rows> &vec)
393*35238bceSAndroid Build Coastguard Worker {
394*35238bceSAndroid Build Coastguard Worker m_data[colNdx] = vec;
395*35238bceSAndroid Build Coastguard Worker }
396*35238bceSAndroid Build Coastguard Worker
397*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
getRow(int rowNdx) const398*35238bceSAndroid Build Coastguard Worker Vector<T, Cols> Matrix<T, Rows, Cols>::getRow(int rowNdx) const
399*35238bceSAndroid Build Coastguard Worker {
400*35238bceSAndroid Build Coastguard Worker Vector<T, Cols> res;
401*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
402*35238bceSAndroid Build Coastguard Worker res[col] = (*this)(rowNdx, col);
403*35238bceSAndroid Build Coastguard Worker return res;
404*35238bceSAndroid Build Coastguard Worker }
405*35238bceSAndroid Build Coastguard Worker
406*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
getColumn(int colNdx)407*35238bceSAndroid Build Coastguard Worker Vector<T, Rows> &Matrix<T, Rows, Cols>::getColumn(int colNdx)
408*35238bceSAndroid Build Coastguard Worker {
409*35238bceSAndroid Build Coastguard Worker return m_data[colNdx];
410*35238bceSAndroid Build Coastguard Worker }
411*35238bceSAndroid Build Coastguard Worker
412*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
getColumn(int colNdx) const413*35238bceSAndroid Build Coastguard Worker const Vector<T, Rows> &Matrix<T, Rows, Cols>::getColumn(int colNdx) const
414*35238bceSAndroid Build Coastguard Worker {
415*35238bceSAndroid Build Coastguard Worker return m_data[colNdx];
416*35238bceSAndroid Build Coastguard Worker }
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
getColumnMajorData(void) const419*35238bceSAndroid Build Coastguard Worker Array<T, Rows * Cols> Matrix<T, Rows, Cols>::getColumnMajorData(void) const
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker Array<T, Rows * Cols> a;
422*35238bceSAndroid Build Coastguard Worker T *dst = a.getPtr();
423*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
424*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
425*35238bceSAndroid Build Coastguard Worker *dst++ = (*this)(row, col);
426*35238bceSAndroid Build Coastguard Worker return a;
427*35238bceSAndroid Build Coastguard Worker }
428*35238bceSAndroid Build Coastguard Worker
429*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
getRowMajorData(void) const430*35238bceSAndroid Build Coastguard Worker Array<T, Rows * Cols> Matrix<T, Rows, Cols>::getRowMajorData(void) const
431*35238bceSAndroid Build Coastguard Worker {
432*35238bceSAndroid Build Coastguard Worker Array<T, Rows * Cols> a;
433*35238bceSAndroid Build Coastguard Worker T *dst = a.getPtr();
434*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
435*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
436*35238bceSAndroid Build Coastguard Worker *dst++ = (*this)(row, col);
437*35238bceSAndroid Build Coastguard Worker return a;
438*35238bceSAndroid Build Coastguard Worker }
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker // Multiplication of two matrices.
441*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows0, int Cols0, int Rows1, int Cols1>
operator *(const Matrix<T,Rows0,Cols0> & a,const Matrix<T,Rows1,Cols1> & b)442*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows0, Cols1> operator*(const Matrix<T, Rows0, Cols0> &a, const Matrix<T, Rows1, Cols1> &b)
443*35238bceSAndroid Build Coastguard Worker {
444*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Cols0 == Rows1);
445*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows0, Cols1> res;
446*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows0; row++)
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols1; col++)
449*35238bceSAndroid Build Coastguard Worker {
450*35238bceSAndroid Build Coastguard Worker T v = T(0);
451*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < Cols0; ndx++)
452*35238bceSAndroid Build Coastguard Worker v += a(row, ndx) * b(ndx, col);
453*35238bceSAndroid Build Coastguard Worker res(row, col) = v;
454*35238bceSAndroid Build Coastguard Worker }
455*35238bceSAndroid Build Coastguard Worker }
456*35238bceSAndroid Build Coastguard Worker return res;
457*35238bceSAndroid Build Coastguard Worker }
458*35238bceSAndroid Build Coastguard Worker
459*35238bceSAndroid Build Coastguard Worker // Multiply of matrix with column vector.
460*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator *(const Matrix<T,Rows,Cols> & mtx,const Vector<T,Cols> & vec)461*35238bceSAndroid Build Coastguard Worker Vector<T, Rows> operator*(const Matrix<T, Rows, Cols> &mtx, const Vector<T, Cols> &vec)
462*35238bceSAndroid Build Coastguard Worker {
463*35238bceSAndroid Build Coastguard Worker Vector<T, Rows> res;
464*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker T v = T(0);
467*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
468*35238bceSAndroid Build Coastguard Worker v += mtx(row, col) * vec.m_data[col];
469*35238bceSAndroid Build Coastguard Worker res.m_data[row] = v;
470*35238bceSAndroid Build Coastguard Worker }
471*35238bceSAndroid Build Coastguard Worker return res;
472*35238bceSAndroid Build Coastguard Worker }
473*35238bceSAndroid Build Coastguard Worker
474*35238bceSAndroid Build Coastguard Worker // Multiply of matrix with row vector.
475*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator *(const Vector<T,Rows> & vec,const Matrix<T,Rows,Cols> & mtx)476*35238bceSAndroid Build Coastguard Worker Vector<T, Cols> operator*(const Vector<T, Rows> &vec, const Matrix<T, Rows, Cols> &mtx)
477*35238bceSAndroid Build Coastguard Worker {
478*35238bceSAndroid Build Coastguard Worker Vector<T, Cols> res;
479*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
480*35238bceSAndroid Build Coastguard Worker {
481*35238bceSAndroid Build Coastguard Worker T v = T(0);
482*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
483*35238bceSAndroid Build Coastguard Worker v += mtx(row, col) * vec.m_data[row];
484*35238bceSAndroid Build Coastguard Worker res.m_data[col] = v;
485*35238bceSAndroid Build Coastguard Worker }
486*35238bceSAndroid Build Coastguard Worker return res;
487*35238bceSAndroid Build Coastguard Worker }
488*35238bceSAndroid Build Coastguard Worker
489*35238bceSAndroid Build Coastguard Worker // Common typedefs.
490*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 2, 2> Matrix2f;
491*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 3, 3> Matrix3f;
492*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 4, 4> Matrix4f;
493*35238bceSAndroid Build Coastguard Worker
494*35238bceSAndroid Build Coastguard Worker // GLSL-style naming \note CxR.
495*35238bceSAndroid Build Coastguard Worker typedef Matrix2f Mat2;
496*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 3, 2> Mat2x3;
497*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 4, 2> Mat2x4;
498*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 2, 3> Mat3x2;
499*35238bceSAndroid Build Coastguard Worker typedef Matrix3f Mat3;
500*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 4, 3> Mat3x4;
501*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 2, 4> Mat4x2;
502*35238bceSAndroid Build Coastguard Worker typedef Matrix<float, 3, 4> Mat4x3;
503*35238bceSAndroid Build Coastguard Worker typedef Matrix4f Mat4;
504*35238bceSAndroid Build Coastguard Worker
505*35238bceSAndroid Build Coastguard Worker //using tcu::Matrix;
506*35238bceSAndroid Build Coastguard Worker // Common typedefs 16Bit.
507*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 2, 2> Matrix2f16b;
508*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 3, 3> Matrix3f16b;
509*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 4, 4> Matrix4f16b;
510*35238bceSAndroid Build Coastguard Worker
511*35238bceSAndroid Build Coastguard Worker // GLSL-style naming \note CxR.
512*35238bceSAndroid Build Coastguard Worker typedef Matrix2f16b Mat2_16b;
513*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 3, 2> Mat2x3_16b;
514*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 4, 2> Mat2x4_16b;
515*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 2, 3> Mat3x2_16b;
516*35238bceSAndroid Build Coastguard Worker typedef Matrix3f16b Mat3_16b;
517*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 4, 3> Mat3x4_16b;
518*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 2, 4> Mat4x2_16b;
519*35238bceSAndroid Build Coastguard Worker typedef Matrix<uint16_t, 3, 4> Mat4x3_16b;
520*35238bceSAndroid Build Coastguard Worker typedef Matrix4f16b Mat4_16b;
521*35238bceSAndroid Build Coastguard Worker
522*35238bceSAndroid Build Coastguard Worker // 64-bit matrices.
523*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 2, 2> Matrix2d;
524*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 3, 3> Matrix3d;
525*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 4, 4> Matrix4d;
526*35238bceSAndroid Build Coastguard Worker
527*35238bceSAndroid Build Coastguard Worker // GLSL-style naming \note CxR.
528*35238bceSAndroid Build Coastguard Worker typedef Matrix2d Mat2d;
529*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 3, 2> Mat2x3d;
530*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 4, 2> Mat2x4d;
531*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 2, 3> Mat3x2d;
532*35238bceSAndroid Build Coastguard Worker typedef Matrix3d Mat3d;
533*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 4, 3> Mat3x4d;
534*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 2, 4> Mat4x2d;
535*35238bceSAndroid Build Coastguard Worker typedef Matrix<double, 3, 4> Mat4x3d;
536*35238bceSAndroid Build Coastguard Worker typedef Matrix4d Mat4d;
537*35238bceSAndroid Build Coastguard Worker
538*35238bceSAndroid Build Coastguard Worker // Matrix-scalar operators.
539*35238bceSAndroid Build Coastguard Worker
540*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator +(const Matrix<T,Rows,Cols> & mtx,T scalar)541*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator+(const Matrix<T, Rows, Cols> &mtx, T scalar)
542*35238bceSAndroid Build Coastguard Worker {
543*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
544*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
545*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
546*35238bceSAndroid Build Coastguard Worker res(row, col) = mtx(row, col) + scalar;
547*35238bceSAndroid Build Coastguard Worker return res;
548*35238bceSAndroid Build Coastguard Worker }
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator -(const Matrix<T,Rows,Cols> & mtx,T scalar)551*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator-(const Matrix<T, Rows, Cols> &mtx, T scalar)
552*35238bceSAndroid Build Coastguard Worker {
553*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
554*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
555*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
556*35238bceSAndroid Build Coastguard Worker res(row, col) = mtx(row, col) - scalar;
557*35238bceSAndroid Build Coastguard Worker return res;
558*35238bceSAndroid Build Coastguard Worker }
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator *(const Matrix<T,Rows,Cols> & mtx,T scalar)561*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator*(const Matrix<T, Rows, Cols> &mtx, T scalar)
562*35238bceSAndroid Build Coastguard Worker {
563*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
564*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
565*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
566*35238bceSAndroid Build Coastguard Worker res(row, col) = mtx(row, col) * scalar;
567*35238bceSAndroid Build Coastguard Worker return res;
568*35238bceSAndroid Build Coastguard Worker }
569*35238bceSAndroid Build Coastguard Worker
570*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator /(const Matrix<T,Rows,Cols> & mtx,T scalar)571*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator/(const Matrix<T, Rows, Cols> &mtx, T scalar)
572*35238bceSAndroid Build Coastguard Worker {
573*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
574*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
575*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
576*35238bceSAndroid Build Coastguard Worker res(row, col) = mtx(row, col) / scalar;
577*35238bceSAndroid Build Coastguard Worker return res;
578*35238bceSAndroid Build Coastguard Worker }
579*35238bceSAndroid Build Coastguard Worker
580*35238bceSAndroid Build Coastguard Worker // Matrix-matrix component-wise operators.
581*35238bceSAndroid Build Coastguard Worker
582*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator +(const Matrix<T,Rows,Cols> & a,const Matrix<T,Rows,Cols> & b)583*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator+(const Matrix<T, Rows, Cols> &a, const Matrix<T, Rows, Cols> &b)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
586*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
587*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
588*35238bceSAndroid Build Coastguard Worker res(row, col) = a(row, col) + b(row, col);
589*35238bceSAndroid Build Coastguard Worker return res;
590*35238bceSAndroid Build Coastguard Worker }
591*35238bceSAndroid Build Coastguard Worker
592*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator -(const Matrix<T,Rows,Cols> & a,const Matrix<T,Rows,Cols> & b)593*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator-(const Matrix<T, Rows, Cols> &a, const Matrix<T, Rows, Cols> &b)
594*35238bceSAndroid Build Coastguard Worker {
595*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
596*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
597*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
598*35238bceSAndroid Build Coastguard Worker res(row, col) = a(row, col) - b(row, col);
599*35238bceSAndroid Build Coastguard Worker return res;
600*35238bceSAndroid Build Coastguard Worker }
601*35238bceSAndroid Build Coastguard Worker
602*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator /(const Matrix<T,Rows,Cols> & a,const Matrix<T,Rows,Cols> & b)603*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> operator/(const Matrix<T, Rows, Cols> &a, const Matrix<T, Rows, Cols> &b)
604*35238bceSAndroid Build Coastguard Worker {
605*35238bceSAndroid Build Coastguard Worker Matrix<T, Rows, Cols> res;
606*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
607*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
608*35238bceSAndroid Build Coastguard Worker res(row, col) = a(row, col) / b(row, col);
609*35238bceSAndroid Build Coastguard Worker return res;
610*35238bceSAndroid Build Coastguard Worker }
611*35238bceSAndroid Build Coastguard Worker
612*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator ==(const Matrix<T,Rows,Cols> & lhs,const Matrix<T,Rows,Cols> & rhs)613*35238bceSAndroid Build Coastguard Worker bool operator==(const Matrix<T, Rows, Cols> &lhs, const Matrix<T, Rows, Cols> &rhs)
614*35238bceSAndroid Build Coastguard Worker {
615*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < Rows; row++)
616*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < Cols; col++)
617*35238bceSAndroid Build Coastguard Worker if (lhs(row, col) != rhs(row, col))
618*35238bceSAndroid Build Coastguard Worker return false;
619*35238bceSAndroid Build Coastguard Worker return true;
620*35238bceSAndroid Build Coastguard Worker }
621*35238bceSAndroid Build Coastguard Worker
622*35238bceSAndroid Build Coastguard Worker template <typename T, int Rows, int Cols>
operator !=(const Matrix<T,Rows,Cols> & lhs,const Matrix<T,Rows,Cols> & rhs)623*35238bceSAndroid Build Coastguard Worker bool operator!=(const Matrix<T, Rows, Cols> &lhs, const Matrix<T, Rows, Cols> &rhs)
624*35238bceSAndroid Build Coastguard Worker {
625*35238bceSAndroid Build Coastguard Worker return !(lhs == rhs);
626*35238bceSAndroid Build Coastguard Worker }
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker } // namespace tcu
629*35238bceSAndroid Build Coastguard Worker
630*35238bceSAndroid Build Coastguard Worker #endif // _TCUMATRIX_HPP
631