1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- #include <core/vector/Distance.h>
- namespace NICE {
- template<>
- Ipp32f EuclidianDistance<Ipp32f>::doCalculate(const VectorT<Ipp32f>& v1, const VectorT<Ipp32f>& v2) const {
- if(v1.size()!=v2.size())
- fthrow(Exception, "Input vectors must have the same size.");
- Ipp32f dist = 0;
- #ifdef NICE_USELIB_IPP
- VectorT<Ipp32f> res(v1.size());
- ippsSub_32f(v1.getDataPointer(), v2.getDataPointer(), res.getDataPointer(), v1.size());
- ippsSqr_32f(res.getDataPointer(), res.getDataPointer(), res.size());
- dist = res.Sum();
- #else // NICE_USELIB_IPP
- const Ipp32f* pSrc1 = v1.getDataPointer();
- const Ipp32f* pSrc2 = v2.getDataPointer();
-
- for(Ipp32u i=0; i<v1.size(); ++i,++pSrc1,++pSrc2)
- dist += (*pSrc1-*pSrc2)*(*pSrc1-*pSrc2);
- #endif // NICE_USELIB_IPP
- dist = std::sqrt(dist);
- return dist;
- }
- template<>
- Ipp32f BhattacharyyaDistance<Ipp32f>::doCalculate(const VectorT<Ipp32f>& v1, const VectorT<Ipp32f>& v2) const {
- if(v1.size()!=v2.size())
- fthrow(Exception, "Input vectors must have the same size.");
- Ipp32f B;
- #ifdef NICE_USELIB_IPP
- VectorT<Ipp32f> v1f(v1);
- v1f *= v2;
- ippsSqrt(v1f.getDataPointer(), v1f.getDataPointer(), v1f.size());
- ippsSum(v1f.getDataPointer(), v1f.size(), &B);
-
- #else // NICE_USELIB_IPP
- B = 0.0;
- for(uint i=0; i<v1.size(); ++i)
- B += std::sqrt(v1[i]*v2[i]);
- #endif // NICE_USELIB_IPP
- return std::sqrt(1-B);
- }
- }
|