/* MCL Copyright (c) 2012-18, Enzo De Sena All rights reserved. Authors: Enzo De Sena, enzodesena@gmail.com */ #ifndef MCL_POINTWISE_H #define MCL_POINTWISE_H #include #include "mcltypes.h" #include #include namespace mcl { /** Returns the point by point addition of the two vectors. Equivalent to Matlab's vector_a+vector_b. */ template std::vector Add(const std::vector& vector_a, const std::vector& vector_b) noexcept { ASSERT(vector_a.size() == vector_b.size()); std::vector output((Int)vector_a.size()); for (Int i=0; i<(Int)vector_a.size(); ++i) { output[i] = vector_a[i]+vector_b[i]; } return output; } void Add(const Real* input_data_a, const Real* input_data_b, Int num_samples, Real* output_data) noexcept; template<> inline std::vector Add(const std::vector& vector_a, const std::vector& vector_b) noexcept { ASSERT(vector_a.size() == vector_b.size()); std::vector output((Int)vector_a.size()); Add(vector_a.data(), vector_b.data(), (Int)vector_a.size(), output.data()); return output; } /** Returns the opposite vector.Equivalent to Matlab's -vector. */ template std::vector Opposite(const std::vector& vector) noexcept { // Checking we are not dealing with unsigned types. // The assert below responds false to complex. TODO: fix this //ASSERT(std::numeric_limits::is_signed); std::vector output(vector.size()); for (Int i=0; i<(Int)vector.size(); ++i) { output[i] = -vector[i]; } return output; } /** Returns the inverse vector.Equivalent to Matlab's 1./vector. */ std::vector Inverse(const std::vector& vector) noexcept; /** Returns the point by point subtraction of the two vectors. Equivalent to Matlab's vector_a-vector_b. */ template std::vector Subtract(const std::vector& vector_a, const std::vector& vector_b) noexcept { return Add(vector_a, Opposite(vector_b)); } /** Returns the point by point multiplication of the two vectors. Equivalent to Matlab's vector_a.*vector_b. */ template std::vector Multiply(const std::vector& vector_a, const std::vector& vector_b) noexcept { ASSERT(vector_a.size() == vector_b.size()); std::vector output((Int)vector_a.size()); for (Int i=0; i<(Int)vector_a.size(); ++i) { output[i] = vector_a[i]*vector_b[i]; } return output; } void Multiply(const Real* input_data_a, const Real* input_data_b, Int num_samples, Real* output_data) noexcept; template<> inline std::vector Multiply(const std::vector& vector_a, const std::vector& vector_b) noexcept { ASSERT(vector_a.size() == vector_b.size()); std::vector output((Int)vector_a.size()); Multiply(vector_a.data(), vector_b.data(), (Int)vector_a.size(), output.data()); return output; } /** Returns the point by point multiplication of the two vectors. Equivalent to Matlab's vector_a.*vector_b. */ template std::vector Divide(const std::vector& vector_a, const std::vector& vector_b) noexcept { ASSERT(vector_a.size() == vector_b.size()); std::vector output((Int)vector_a.size()); for (Int i=0; i<(Int)vector_a.size(); ++i) { output[i] = vector_a[i]/vector_b[i]; } return output; } /** Equivalent to Matlab's exp(vector). */ template std::vector Exp(const std::vector& vector) noexcept { Int n(vector.size()); std::vector output(vector.size()); for (Int i=0; i Conj(const std::vector& vector) noexcept; /** Transform real vector into complex vector with null imaginary part */ std::vector ComplexVector(const std::vector& input) noexcept; /** Equivalent to Matlab's real(input). */ std::vector RealPart(const std::vector& input) noexcept; /** Equivalent to Matlab's imag(input). */ std::vector Imag(const std::vector& input) noexcept; /** Returns the point-wise poser to exponent. Equivalent to Matlab's vector.^exponent */ std::vector Pow(const std::vector& vector, Real exponent) noexcept; /** Equivalent to Matlab's abs(vector) */ std::vector Abs(const std::vector& input) noexcept; /** Equivalent to Matlab's abs(vector) */ std::vector Abs(const std::vector& input) noexcept; /** Equivalent to Matlab's vector.*(vector>0) */ std::vector HalfWave(const std::vector& vector) noexcept; /** Equivalent to Matlab's cos(vector) */ std::vector Cos(const std::vector& vector) noexcept; /** Equivalent to Matlab's sin(vector) */ std::vector Sin(const std::vector& vector) noexcept; /** Returns the natural logarithm of the elements of vector. Equivalent to Matlab's log(vector). */ std::vector Log(const std::vector& vector) noexcept; /** Returns the 10-base logarithm of the elements of vector. Equivalent to Matlab's log10(vector). */ std::vector Log10(const std::vector& vector) noexcept; std::vector ConvertToInt(const std::vector& vector) noexcept; bool PointWiseOpTest(); } /**< namespace mcl */ #endif