17 #ifndef OPENKALMAN_SPECIAL_MATRIX_ARITHMETIC_HPP 18 #define OPENKALMAN_SPECIAL_MATRIX_ARITHMETIC_HPP 27 template<indexible Arg1, vector_space_descriptors_may_match_with Arg2> requires
28 (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1>) or
29 (constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>)
31 template<
typename Arg1,
typename Arg2, std::enable_if_t<vector_space_descriptors_may_match_with<Arg1, Arg2> and
32 (constant_adapter<Arg1> or
internal::diagonal_expr<Arg1> or
internal::triangular_expr<Arg1> or
internal::hermitian_expr<Arg1>) or
33 (constant_adapter<Arg2> or
internal::diagonal_expr<Arg2> or
internal::triangular_expr<Arg2> or
internal::hermitian_expr<Arg2>),
int> = 0>
35 inline auto operator+(Arg1&& arg1, Arg2&& arg2)
37 return sum(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2));
45 template<indexible Arg1, vector_space_descriptors_may_match_with Arg2> requires
46 (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1>) or
47 (constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>)
49 template<
typename Arg1,
typename Arg2, std::enable_if_t<vector_space_descriptors_may_match_with<Arg1, Arg2> and
50 (constant_adapter<Arg1> or
internal::diagonal_expr<Arg1> or
internal::triangular_expr<Arg1> or
internal::hermitian_expr<Arg1>) or
51 (constant_adapter<Arg2> or
internal::diagonal_expr<Arg2> or
internal::triangular_expr<Arg2> or
internal::hermitian_expr<Arg2>),
int> = 0>
53 constexpr
auto operator-(Arg1&& arg1, Arg2&& arg2)
55 return sum(std::forward<Arg1>(arg1), -std::forward<Arg2>(arg2));
63 template<indexible Arg1, indexible Arg2> requires
64 (dynamic_dimension<Arg1, 1> or dynamic_dimension<Arg2, 0> or compares_with<vector_space_descriptor_of_t<Arg1, 1>, vector_space_descriptor_of_t<Arg2, 0>>) and
65 (
constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1> or
66 constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>)
68 template<
typename Arg1,
typename Arg2, std::enable_if_t<
69 (dynamic_dimension<Arg1, 1> or dynamic_dimension<Arg2, 0> or compares_with<typename vector_space_descriptor_of<Arg1, 1>::type,
typename vector_space_descriptor_of<Arg2, 0>::type>) and
70 (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1> or
71 constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>),
int> = 0>
73 inline auto operator*(Arg1&& arg1, Arg2&& arg2)
75 return contract(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2));
81 #endif //OPENKALMAN_SPECIAL_MATRIX_ARITHMETIC_HPP decltype(auto) constexpr contract(A &&a, B &&b)
Matrix multiplication of A * B.
Definition: contract.hpp:54
The root namespace for OpenKalman.
Definition: basics.hpp:34
constexpr bool constant_adapter
Specifies that T is a ConstantAdapter.
Definition: forward-class-declarations.hpp:78
decltype(auto) constexpr sum(Ts &&...ts)
Element-by-element sum of one or more objects.
Definition: sum.hpp:112