52 #ifndef __PCL_Vector_h
53 #define __PCL_Vector_h
58 #include <pcl/Diagnostics.h>
67 #ifndef __PCL_NO_VECTOR_STATISTICS
71 #ifndef __PCL_NO_VECTOR_INSTANTIATE
105 template <
typename T>
161 PCL_PRECONDITION( len >= 0 )
162 m_data =
new Data( len );
173 PCL_PRECONDITION( len >= 0 )
174 m_data =
new Data( len );
175 iterator __restrict__ i = m_data->Begin();
192 template <
typename T1>
195 PCL_PRECONDITION( len >= 0 )
196 m_data =
new Data( len );
199 iterator __restrict__ i = m_data->Begin();
201 const T1* __restrict__ k = a;
203 for ( ; i < j; ++i, ++k )
216 template <
typename T1>
226 template <
typename T1>
229 m_data =
new Data( 3 );
240 template <
typename T1>
243 m_data =
new Data( 4 );
278 template <
typename T1>
290 if ( m_data !=
nullptr )
303 if ( m_data->IsUnique() )
304 m_data->Deallocate();
307 Data* newData =
new Data( 0 );
421 Data* newData =
new Data( m_data->Length() );
425 iterator __restrict__ i = m_data->Begin();
448 if ( x.
Length() < Length() )
449 throw Error(
"Invalid vector addition." );
451 iterator __restrict__ i = m_data->Begin();
455 for ( ; i < j; ++i, ++k )
475 if ( x.
Length() < Length() )
476 throw Error(
"Invalid vector subtraction." );
478 iterator __restrict__ i = m_data->Begin();
482 for ( ; i < j; ++i, ++k )
502 if ( x.
Length() < Length() )
503 throw Error(
"Invalid vector multiplication." );
505 iterator __restrict__ i = m_data->Begin();
509 for ( ; i < j; ++i, ++k )
533 if ( x.
Length() < Length() )
534 throw Error(
"Invalid vector division." );
536 iterator __restrict__ i = m_data->Begin();
540 for ( ; i < j; ++i, ++k )
545 #define IMPLEMENT_SCALAR_ASSIGN_OP( op ) \
548 iterator __restrict__ i = m_data->Begin(); \
549 const_iterator __restrict__ j = m_data->End(); \
551 for ( ; i < j; ++i ) \
556 Data* newData = new Data( m_data->Length() ); \
557 const_iterator __restrict__ i = m_data->Begin(); \
558 const_iterator __restrict__ j = m_data->End(); \
559 iterator __restrict__ k = newData->Begin(); \
561 for ( ; i < j; ++i, ++k ) \
578 IMPLEMENT_SCALAR_ASSIGN_OP( + )
591 IMPLEMENT_SCALAR_ASSIGN_OP( - )
604 IMPLEMENT_SCALAR_ASSIGN_OP( * )
617 IMPLEMENT_SCALAR_ASSIGN_OP( / )
632 iterator __restrict__ i = m_data->Begin();
640 Data* newData =
new Data( m_data->Length() );
643 iterator __restrict__ k = newData->Begin();
645 for ( ; i < j; ++i, ++k )
653 #undef IMPLEMENT_SCALAR_ASSIGN_OP
665 PCL_PRECONDITION( v.Length() >= Length() )
671 for ( ; i < j; ++i, ++k )
685 PCL_PRECONDITION( Length() == 3 && v2.
Length() == 3 )
706 iterator __restrict__ k = R.Begin();
708 for ( ; i < j; ++i, ++k )
723 iterator __restrict__ i = m_data->Begin();
731 Data* newData =
new Data( m_data->Length() );
734 iterator __restrict__ k = newData->Begin();
736 for ( ; i < j; ++i, ++k )
753 iterator __restrict__ k = R.Begin();
755 for ( ; i < j; ++i, ++k )
770 iterator __restrict__ i = m_data->Begin();
778 Data* newData =
new Data( m_data->Length() );
781 iterator __restrict__ k = newData->Begin();
783 for ( ; i < j; ++i, ++k )
800 iterator __restrict__ k = R.Begin();
802 for ( ; i < j; ++i, ++k )
817 iterator __restrict__ i = m_data->Begin();
824 Data* newData =
new Data( m_data->Length() );
827 iterator __restrict__ k = newData->Begin();
829 for ( ; i < j; ++i, ++k )
846 iterator __restrict__ k = R.Begin();
848 for ( ; i < j; ++i, ++k )
863 iterator __restrict__ i = m_data->Begin();
871 Data* newData =
new Data( m_data->Length() );
874 iterator __restrict__ k = newData->Begin();
876 for ( ; i < j; ++i, ++k )
895 return pcl::Norm( m_data->Begin(), m_data->End(), p );
904 return pcl::L1Norm( m_data->Begin(), m_data->End() );
913 return pcl::L2Norm( m_data->Begin(), m_data->End() );
946 (void)
operator /=( N );
955 pcl::Sort( m_data->Begin(), m_data->End() );
974 pcl::Sort( m_data->Begin(), m_data->End(),
975 [](
const scalar& a,
const scalar& b ){ return b < a; } );
998 pcl::Sort( m_data->Begin(), m_data->End(), p );
1020 return (p != m_data->End()) ? int( p - m_data->Begin() ) : -1;
1040 return (p != m_data->End()) ? int( p - m_data->Begin() ) : -1;
1051 #ifndef __PCL_NO_VECTOR_STATISTICS
1062 return int(
pcl::MinItem( m_data->Begin(), m_data->End() ) - m_data->Begin() );
1074 return int(
pcl::MaxItem( m_data->Begin(), m_data->End() ) - m_data->Begin() );
1088 if ( m_data->Length() > 0 )
1089 for (
iterator j = m_data->Begin(); ++j < m_data->End(); )
1092 return i - m_data->Begin();
1106 if ( m_data->Length() > 0 )
1107 for (
iterator j = m_data->Begin(); ++j < m_data->End(); )
1110 return i - m_data->Begin();
1123 if ( m_data->Length() > 0 )
1126 if ( ++i == m_data->End() )
1127 return m_data->Length();
1128 for (
iterator j = i; ++j < m_data->End(); )
1133 return i - m_data->Begin();
1147 if ( m_data->Length() > 0 )
1150 if ( ++i == m_data->End() )
1151 return m_data->Length();
1152 for (
iterator j = i; ++j < m_data->End(); )
1157 return i - m_data->Begin();
1166 if ( m_data->Length() > 0 )
1167 return *
pcl::MinItem( m_data->Begin(), m_data->End() );
1177 if ( m_data->Length() > 0 )
1178 return *
pcl::MaxItem( m_data->Begin(), m_data->End() );
1200 PCL_PRECONDITION( !IsEmpty() )
1201 PCL_PRECONDITION( k >= 0 && k < m_data->Length() )
1203 return *
pcl::Select( m_data->Begin(), m_data->End(), k );
1232 return pcl::Sum( m_data->Begin(), m_data->End() );
1292 return pcl::Mean( m_data->Begin(), m_data->End() );
1348 return pcl::StdDev( m_data->Begin(), m_data->End() );
1358 return pcl::Median( m_data->Begin(), m_data->End() );
1375 double AvgDev(
double center )
const noexcept
1377 return pcl::AvgDev( m_data->Begin(), m_data->End(), center );
1414 return pcl::AvgDev( m_data->Begin(), m_data->End() );
1467 double MAD(
double center )
const
1469 return pcl::MAD( m_data->Begin(), m_data->End(), center );
1484 return pcl::MAD( m_data->Begin(), m_data->End() );
1542 double BiweightMidvariance(
double center,
double sigma,
int k = 9,
bool reducedLength =
false ) const noexcept
1577 double center =
Median();
1596 int k = 9,
bool reducedLength =
false ) const noexcept
1609 double center =
Median();
1733 return pcl::Hash64( m_data->Begin(), m_data->Size(), seed );
1746 return pcl::Hash32( m_data->Begin(), m_data->Size(), seed );
1763 return m_data->IsUnique();
1772 return m_data == x.m_data;
1786 Data* newData =
new Data( m_data->Length() );
1789 iterator __restrict__ k = newData->Begin();
1791 for ( ; i < j; ++i, ++k )
1804 return m_data->Length();
1813 return m_data->Size();
1832 return m_data !=
nullptr;
1841 return Length() == 0;
1849 operator bool() const noexcept
1861 return IsAliasOf( x ) || SameLength( x ) &&
pcl::Equal( Begin(), x.Begin(), x.End() );
1875 return !IsAliasOf( x ) &&
pcl::Compare( Begin(), End(), x.Begin(), x.End() ) < 0;
1883 return Length() == x.Length();
1896 return m_data->At( i );
1905 return m_data->At( i );
1921 return m_data->Begin();
1933 return m_data->Begin();
1980 return m_data->End();
1993 return m_data->End();
2060 return m_data->At( i );
2063 #ifndef __PCL_NO_STL_COMPATIBLE_ITERATORS
2118 template <
typename T1,
typename T2>
2121 PCL_PRECONDITION( Length() >= 3 )
2122 double x = *At( 0 );
2123 double y = *At( 1 );
2124 double z = *At( 2 );
2125 double m2 = x*x + y*y;
2126 lon = T1( (m2 == 0) ? 0.0 :
ArcTan( y, x ) );
2138 template <
typename T1,
typename T2>
2141 ToSpherical( lon, lat );
2179 template <
typename T1,
typename T2>
2182 double slon, clon, slat, clat;
2183 SinCos(
double( lon ), slon, clon );
2184 SinCos(
double( lat ), slat, clat );
2185 return FromSpherical( slon, clon, slat, clat );
2198 template <
typename T1>
2225 return ArcTan( x1*y2 - y1*x2, Dot( v ) );
2266 return ArcTan( (((n * c) >= 0) ? 1 : -1) * c.
L2Norm(), Dot( v ) );
2285 template <
class S,
typename SP>
2286 S& ToSeparated( S& s, SP separator )
const
2291 s.Append( S( *i ) );
2295 s.Append( separator );
2296 s.Append( S( *i ) );
2325 template <
class S,
typename SP,
class AF>
2326 S& ToSeparated( S& s, SP separator, AF append )
const
2331 append( s, S( *i ) );
2338 append( s, S( *i ) );
2355 S& ToCommaSeparated( S& s )
const
2357 return ToSeparated( s,
',' );
2369 S& ToSpaceSeparated( S& s )
const
2371 return ToSeparated( s,
' ' );
2383 S& ToTabSeparated( S& s )
const
2385 return ToSeparated( s,
'\t' );
2398 component* v =
nullptr;
2413 int Length() const noexcept
2420 return size_type( n )*
sizeof( component );
2423 iterator At(
int i )
const noexcept
2428 iterator Begin() const noexcept
2435 iterator End() const noexcept
2440 void Allocate(
int len )
2443 if ( likely( std::is_scalar<component>::value ) )
2445 v =
reinterpret_cast<component*
>( PCL_ALIGNED_MALLOC( Size(), 32 ) );
2446 if ( unlikely( v ==
nullptr ) )
2449 throw std::bad_alloc();
2453 v =
new component[ len ];
2458 PCL_PRECONDITION( refCount == 0 )
2459 if ( likely( std::is_scalar<component>::value ) )
2460 PCL_ALIGNED_FREE( v );
2472 Data* m_data =
nullptr;
2478 void DetachFromData()
2480 if ( !m_data->Detach() )
2501 template <
typename T>
inline
2505 if ( B.Length() < n )
2506 throw Error(
"Invalid vector addition." );
2511 if ( likely( !A.IsAliasOf( B ) ) )
2515 for ( ; a < c; ++a, ++b, ++r )
2521 for ( ; a < c; ++a, ++r )
2534 template <
typename T>
inline
2538 return std::move( A );
2548 template <
typename T>
inline
2552 return std::move( B );
2563 template <
typename T>
inline
2567 return std::move( A );
2574 template <
typename T,
typename S>
inline
2582 for ( ; a < c; ++a, ++r )
2591 template <
typename T,
typename S>
inline
2595 return std::move( A );
2605 template <
typename T,
typename S>
inline
2618 template <
typename T,
typename S>
inline
2622 return std::move( A );
2634 template <
typename T>
inline
2638 if ( B.Length() < n )
2639 throw Error(
"Invalid vector subtraction." );
2645 if ( likely( !A.IsAliasOf( B ) ) )
2649 for ( ; a < c; ++a, ++b, ++r )
2655 for ( ; a < c; ++a, ++r )
2669 template <
typename T>
inline
2673 return std::move( A );
2684 template <
typename T>
inline
2687 if ( A.Length() < B.Length() )
2688 throw Error(
"Invalid vector subtraction." );
2694 for ( ; b < c; ++a, ++b )
2696 return std::move( B );
2707 template <
typename T>
inline
2711 return std::move( A );
2718 template <
typename T,
typename S>
inline
2726 for ( ; a < c; ++a, ++r )
2736 template <
typename T,
typename S>
inline
2740 return std::move( A );
2751 template <
typename T,
typename S>
inline
2759 for ( ; a < c; ++a, ++r )
2773 template <
typename T,
typename S>
inline
2779 for ( ; a < c; ++a )
2781 return std::move( A );
2794 template <
typename T>
inline
2797 PCL_PRECONDITION( A.Length() == 3 && B.Length() == 3 )
2799 A[2]*B[0] - A[0]*B[2],
2800 A[0]*B[1] - A[1]*B[0] );
2811 template <
typename T>
inline
2814 T x = A[1]*B[2] - A[2]*B[1],
2815 y = A[2]*B[0] - A[0]*B[2],
2816 z = A[0]*B[1] - A[1]*B[0];
2818 a[0] = x; a[1] = y; a[2] = z;
2819 return std::move( A );
2830 template <
typename T>
inline
2833 T x = A[1]*B[2] - A[2]*B[1],
2834 y = A[2]*B[0] - A[0]*B[2],
2835 z = A[0]*B[1] - A[1]*B[0];
2837 b[0] = x; b[1] = y; b[2] = z;
2838 return std::move( B );
2850 template <
typename T>
inline
2853 T x = A[1]*B[2] - A[2]*B[1],
2854 y = A[2]*B[0] - A[0]*B[2],
2855 z = A[0]*B[1] - A[1]*B[0];
2857 a[0] = x; a[1] = y; a[2] = z;
2858 return std::move( A );
2871 template <
typename T>
inline
2874 PCL_PRECONDITION( B.Length() >= A.Length() )
2878 if ( likely( !A.IsAliasOf( B ) ) )
2882 for ( ; a < c; ++a, ++b )
2888 for ( ; a < c; ++a )
2900 template <
typename T,
typename S>
inline
2908 for ( ; a < c; ++a, ++r )
2917 template <
typename T,
typename S>
inline
2921 return std::move( A );
2931 template <
typename T,
typename S>
inline
2944 template <
typename T,
typename S>
inline
2948 return std::move( A );
2957 template <
typename T,
typename S>
inline
2965 for ( ; a < c; ++a, ++r )
2975 template <
typename T,
typename S>
inline
2979 return std::move( A );
2989 template <
typename T,
typename S>
inline
2997 for ( ; a < c; ++a, ++r )
3010 template <
typename T,
typename S>
inline
3016 for ( ; a < c; ++a )
3018 return std::move( A );
3026 template <
typename T>
inline
3030 if ( B.Length() < n )
3031 throw Error(
"Invalid vector division." );
3037 if ( likely( !A.IsAliasOf( B ) ) )
3041 for ( ; a < c; ++a, ++b, ++r )
3047 for ( ; a < c; ++a, ++r )
3058 template <
typename T>
inline
3070 template <
typename T,
typename S>
inline
3078 for ( ; a < c; ++a, ++r )
3088 template <
typename T,
typename S>
inline
3092 return std::move( A );
3102 template <
typename T,
typename S>
inline
3110 for ( ; a < c; ++a, ++r )
3123 template <
typename T,
typename S>
inline
3129 for ( ; a < c; ++a )
3131 return std::move( A );
3136 #ifndef __PCL_NO_VECTOR_INSTANTIATE
3149 using I8Vector = GenericVector<int8>;
3261 using SzVector = GenericVector<size_type>;
3289 using F64Vector = GenericVector<double>;
3318 using C32Vector = GenericVector<Complex32>;
3327 using C64Vector = GenericVector<Complex64>;
3342 using F80Vector = GenericVector<long double>;
8-bit unsigned integer vector.
32-bit floating point complex vector.
64-bit floating point complex vector.
8-bit signed integer vector.
64-bit floating point real vector.
Root base class of all PCL containers of objects.
A simple exception with an associated error message.
32-bit floating point real vector.
64-bit floating point real vector.
80-bit extended precision floating point real vector.
32-bit floating point real vector.
Generic vector of arbitrary length.
void Transfer(GenericVector &x)
double Angle2D(const GenericVector &v) const noexcept
double StdDev() const noexcept
GenericVector(const T1 *a, int len)
double TrimmedMeanOfSquares(distance_type l=1, distance_type h=1) const noexcept
double BendMidvariance(double beta=0.2) const
TwoSidedEstimate TwoSidedBiweightMidvariance(double center, const TwoSidedEstimate &sigma, int k=9, bool reducedLength=false) const noexcept
scalar L1Norm() const noexcept
void Transfer(GenericVector &&x)
static GenericVector FromSpherical(double slon, double clon, double slat, double clat)
double BiweightMidvariance(double center, double sigma, int k=9, bool reducedLength=false) const noexcept
const_iterator end() const noexcept
component OrderStatistic(int k)
double Angle3D(const GenericVector &v) const noexcept
const_iterator ConstEnd() const noexcept
bool IsUnique() const noexcept
double SumOfSquares() const noexcept
void ToSpherical(T1 &lon, T2 &lat) const noexcept
size_type Size() const noexcept
GenericVector Sorted() const
int IndexOfLastLargestComponent() const noexcept
double Angle3D(const GenericVector &v, const GenericVector &n) const
component MaxComponent() const noexcept
TwoSidedEstimate TwoSidedMAD() const
int FindFirst(const component &x) const noexcept
GenericVector Sqrt() const
double StableSum() const noexcept
double StableAvgDev(double center) const noexcept
GenericVector Cross(const GenericVector &v2) const
GenericVector(std::initializer_list< T1 > c)
static GenericVector FromArray(const T1 *a, int len)
int IndexOfLastSmallestNonzeroComponent() const noexcept
int FindLast(const component &x) const noexcept
scalar Norm(double p) const noexcept
bool IsEmpty() const noexcept
double StableModulus() const noexcept
uint64 Hash64(uint64 seed=0) const noexcept
GenericVector Sorted(BP p) const
GenericVector Unit() const
int IndexOfLargestComponent() const noexcept
int IndexOfSmallestNonzeroComponent() const noexcept
int Find(const component &x) const noexcept
friend void Swap(GenericVector &x1, GenericVector &x2) noexcept
double StableSumOfSquares() const noexcept
bool IsValid() const noexcept
component MinComponent() const noexcept
uint64 Hash(uint64 seed=0) const noexcept
double Variance() const noexcept
void Assign(const GenericVector &x)
const_iterator Begin() const noexcept
scalar Dot(const GenericVector &v) const noexcept
double MAD(double center) const
GenericVector Sqr() const
uint32 Hash32(uint32 seed=0) const noexcept
GenericVector(GenericVector &&x)
static GenericVector FromSpherical(const T1 &lon, const T2 &lat)
double BiweightMidvariance(int k=9, bool reducedLength=false) const
scalar L2Norm() const noexcept
iterator ComponentPtr(int i) noexcept
int Length() const noexcept
GenericVector(const GenericVector< T1 > &x)
TwoSidedEstimate TwoSidedAvgDev() const
TwoSidedEstimate TwoSidedBiweightMidvariance(int k=9, bool reducedLength=false) const
TwoSidedEstimate TwoSidedAvgDev(double center) const noexcept
void ToSpherical2Pi(T1 &lon, T2 &lat) const noexcept
const_iterator End() const noexcept
GenericVector ReverseSorted() const
GenericVector(const T1 &x, const T1 &y, const T1 &z)
scalar Norm() const noexcept
iterator DataPtr() noexcept
double StableAvgDev() const
double Sum() const noexcept
double TrimmedMean(distance_type l=1, distance_type h=1) const noexcept
bool IsAliasOf(const GenericVector &x) const noexcept
double Modulus() const noexcept
GenericVector(const T1 &x, const T1 &y, const T1 &z, const T1 &t)
int IndexOfSmallestComponent() const noexcept
double StableMean() const noexcept
bool Contains(const component &x) const noexcept
component OrderStatistic(int k) const
TwoSidedEstimate TwoSidedMAD(double center) const
const_iterator At(int i) const noexcept
bool SameLength(const GenericVector &x) const noexcept
GenericVector Abs() const
double AvgDev(double center) const noexcept
GenericVector(const component &x, int len)
GenericVector(const GenericVector &x)
const_iterator ConstBegin() const noexcept
int IndexOfLastSmallestComponent() const noexcept
double BendMidvariance(double center, double beta=0.2) const
const_iterator begin() const noexcept
16-bit signed integer vector.
32-bit signed integer vector.
8-bit signed integer vector.
32-bit signed integer vector.
80-bit extended precision floating point real vector.
Thread-safe reference counter for copy-on-write data structures.
size_type integer vector.
16-bit unsigned integer vector.
32-bit unsigned integer vector.
64-bit unsigned integer vector.
8-bit unsigned integer vector.
32-bit unsigned integer vector.
64-bit floating point real vector.
bool operator==(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
bool operator<(const Array< T, A > &x1, const Array< T, A > &x2) noexcept
Complex< T1 > operator-(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Complex< T1 > operator*(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Complex< T1 > operator+(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Complex< T1 > operator/(const Complex< T1 > &c1, const Complex< T2 > &c2) noexcept
Complex< T1 > Pow(const Complex< T1 > &c, T2 x) noexcept
Complex< T > Sqrt(const Complex< T > &c) noexcept
T Abs(const Complex< T > &c) noexcept
uint64 Hash64(const void *data, size_type size, uint64 seed=0) noexcept
uint32 Hash32(const void *data, size_type size, uint32 seed=0) noexcept
GenericImage< P > operator^(const GenericImage< P > &image, T scalar)
void SinCos(T x, T &sx, T &cx) noexcept
T L1Norm(const T *i, const T *j) noexcept
constexpr T ArcTan(T x) noexcept
constexpr long double TwoPi() noexcept
T Norm(const T *i, const T *j, const P &p) noexcept
T L2Norm(const T *i, const T *j) noexcept
void Swap(GenericPoint< T > &p1, GenericPoint< T > &p2) noexcept
unsigned long long uint64
FI LinearSearch(FI i, FI j, const T &v) noexcept
BI LinearSearchLast(BI i, BI j, const T &v) noexcept
RI Select(RI i, RI j, distance_type k)
double Qn(T *__restrict__ x, T *__restrict__ xn)
double BendMidvariance(const T *__restrict__ x, const T *__restrict__ xn, double center, double beta=0.2)
double StableModulus(const T *__restrict__ i, const T *__restrict__ j) noexcept
double MAD(const T *__restrict__ i, const T *__restrict__ j, double center, double eps=0)
double SumOfSquares(const T *__restrict__ i, const T *__restrict__ j) noexcept
double StableMean(const T *__restrict__ i, const T *__restrict__ j) noexcept
double TrimmedMean(const T *__restrict__ i, const T *__restrict__ j, distance_type l=1, distance_type h=1)
TwoSidedEstimate TwoSidedMAD(const T *__restrict__ i, const T *__restrict__ j, double center, double eps=0)
double StableSum(const T *__restrict__ i, const T *__restrict__ j) noexcept
double Variance(const T *__restrict__ i, const T *__restrict__ j, double center) noexcept
TwoSidedEstimate TwoSidedBiweightMidvariance(const T *__restrict__ x, const T *__restrict__ xn, double center, const TwoSidedEstimate &sigma, int k=9, bool reducedLength=false) noexcept
double Sum(const T *__restrict__ i, const T *__restrict__ j) noexcept
double StableSumOfSquares(const T *__restrict__ i, const T *__restrict__ j) noexcept
double BiweightMidvariance(const T *__restrict__ x, const T *__restrict__ xn, double center, double sigma, int k=9, bool reducedLength=false) noexcept
double StdDev(const T *__restrict__ i, const T *__restrict__ j, double center) noexcept
double TrimmedMeanOfSquares(const T *__restrict__ i, const T *__restrict__ j, distance_type l=1, distance_type h=1)
double AvgDev(const T *__restrict__ i, const T *__restrict__ j, double center) noexcept
double Median(const T *__restrict__ i, const T *__restrict__ j, double eps=0)
double Mean(const T *__restrict__ i, const T *__restrict__ j) noexcept
double StableAvgDev(const T *__restrict__ i, const T *__restrict__ j, double center) noexcept
TwoSidedEstimate TwoSidedAvgDev(const T *__restrict__ i, const T *__restrict__ j, double center) noexcept
double Modulus(const T *__restrict__ i, const T *__restrict__ j) noexcept
double Sn(T *__restrict__ x, T *__restrict__ xn)
FI MinItem(FI i, FI j) noexcept
bool Equal(FI1 i1, FI2 i2, FI2 j2) noexcept
int Compare(FI1 i1, FI1 j1, FI2 i2, FI2 j2) noexcept
FI MaxItem(FI i, FI j) noexcept
Two-sided descriptive statistical estimate.