33 template <
typename T,
typename U>
34 auto operator+(
const std::vector<T> &v1,
const std::vector<U> &v2) {
35 assert(v1.size() == v2.size());
36 std::vector<decltype(T(1) + U(1))> result;
37 result.reserve(v1.size());
38 std::transform(std::begin(v1), std::end(v1), std::begin(v2), std::back_inserter(result), [](T i, U j) {
return i + j; });
51 template <
typename T,
typename U>
52 auto operator+(
const std::vector<T> &v,
const U s) {
53 std::vector<decltype(T(1) + U(1))> result;
54 result.reserve(v.size());
55 std::transform(std::begin(v), std::end(v), std::back_inserter(result), [s](T i) {
return i + s; });
68 template <
typename T,
typename U>
69 auto operator-(std::vector<T> &v1, std::vector<U> &v2) {
70 assert(v1.size() == v2.size());
71 std::vector<decltype(v1.at(0) - v2.at(0))> result;
72 result.reserve(v1.size());
73 std::transform(std::begin(v1), std::end(v1), std::begin(v2), std::back_inserter(result), [](T i, U j) {
return i - j; });
86 template <
typename T,
typename U>
87 auto operator-(
const std::vector<T> &v,
const U s) {
88 std::vector<decltype(T(1) - U(1))> result;
89 result.reserve(v.size());
90 std::transform(std::begin(v), std::end(v), std::back_inserter(result), [s](T i) {
return i - s; });
103 template <
typename T,
typename U>
104 auto operator*(
const T &s,
const std::vector<U> &v) {
105 std::vector<decltype(T(1) * U(1))> result;
106 result.reserve(v.size());
107 std::transform(std::begin(v), std::end(v), std::back_inserter(result), [s](U i) {
return i * s; });
120 template <
typename T,
typename U>
121 auto operator*(
const std::vector<T> &v,
const U &s) {
122 std::vector<decltype(T(1) * U(1))> result;
123 result.reserve(v.size());
124 std::transform(std::begin(v), std::end(v), std::back_inserter(result), [s](T i) {
return i * s; });
137 template <
typename T,
typename U>
138 auto operator/(
const std::vector<T>& v,
const U& s) {
139 std::vector<decltype(T(1) / U(1))> result;
140 result.reserve(v.size());
141 std::transform(std::begin(v), std::end(v), std::back_inserter(result), [s](T i) {
return i / s; });
154 template <
typename T,
typename U>
155 auto dot_product(
const std::vector<T> &v1,
const std::vector<U> &v2) {
156 assert(v1.size() == v2.size());
158 return std::inner_product(std::begin(v1), std::end(v1), std::begin(v2), T(0)*U(0));
170 template <
typename T,
typename U>
171 auto operator*(
const std::vector<std::vector<T>> &m,
const std::vector<U> &v) {
172 std::vector<decltype(T(1)*U(1))> result;
173 result.reserve(v.size());
174 std::transform(std::begin(m), std::end(m), std::back_inserter(result), [v](std::vector<T> m_i) {
return dot_product(m_i, v); });
188 template <
typename T,
typename U>
189 auto operator*(
const std::vector<std::vector<T>> &m1,
const std::vector<std::vector<U>> &m2) {
190 assert(m1.at(0).size() == m2.size());
191 std::vector<std::vector<decltype(T(1) * U(1))>> result;
192 result.reserve(m1.size());
193 std::transform(std::begin(m2), std::end(m2), std::back_inserter(result), [m1](std::vector<U> m_i) {
return m1 * m_i; });
205 template <
typename T>
206 auto transpose(
const std::vector<std::vector<T>> &m) {
207 std::vector<std::vector<T>> result(m.at(0).size(), std::vector<T>(m.size()));
208 for (std::vector<int>::size_type i = 0; i < m.size(); i++) {
209 for (
size_t j = 0; j < m[0].size(); j++) {
210 result.at(j).at(i) = m.at(i).at(j);
223 template <
typename T>
224 auto diag(
const std::vector<std::vector<T>> &m) {
225 assert(m.size() == m.at(0).size());
226 std::vector<T> result;
227 for (
size_t i = 0; i < m.size(); i++)
229 result.push_back(m.at(i).at(i));