12 #include <tracking/trackFindingCDC/numerics/PlainMatrix.h>
19 namespace TrackFindingCDC {
22 struct PlainMatrixUtil {
25 template <
class T,
int M>
26 static PlainMatrix<T, M, M>
Diag(
const PlainMatrix<T, M, 1>& diagEntries)
28 PlainMatrix<T, M, M> result{{}};
29 for (
size_t s = 0, i = 0; s < result.size(); s += M + 1, ++i)
30 result[s] = diagEntries(i, 0);
35 template <
class T,
int K,
int L,
int M,
int N>
39 const int nRows = K + M;
45 for (
int iACol = 0; iACol < nACols; ++iACol) {
46 std::copy(a.data() + iACol * nARows,
47 a.data() + (iACol + 1) * nARows,
48 result.data() + iACol * nRows);
53 const int skipA = nACols * nRows;
54 const int skipFront = nARows;
55 for (
int iBCol = 0; iBCol < nBCols; ++iBCol) {
56 std::copy(b.data() + iBCol * nBRows,
57 b.data() + (iBCol + 1) * nBRows,
58 result.data() + skipA + skipFront + iBCol * nRows);
64 template <
class T,
int K,
int M,
int N>
65 static PlainMatrix < T, K + M, N >
66 VStack(
const PlainMatrix<T, K, N>& a,
const PlainMatrix<T, M, N>& b)
68 const int nRows = K + M;
70 PlainMatrix < T, K + M, N > result;
74 const int skipFront = nARows;
75 for (
int iCol = 0; iCol < nCols; ++iCol) {
76 std::copy(a.data() + iCol * nARows,
77 a.data() + (iCol + 1) * nARows,
78 result.data() + iCol * nRows);
80 std::copy(b.data() + iCol * nBRows,
81 b.data() + (iCol + 1) * nBRows,
82 result.data() + skipFront + iCol * nRows);
88 template <
class T,
int M,
int L,
int N>
89 static PlainMatrix < T, M, L + N >
90 HStack(
const PlainMatrix<T, M, L>& a,
const PlainMatrix<T, M, N>& b)
92 PlainMatrix < T, M, L + N > result;
93 std::copy(a.data(), a.data() + a.size(), result.data());
94 std::copy(b.data(), b.data() + b.size(), result.data() + a.size());