float A[5] = [a0,a1,a2,a3,a4];
float B[5] = [b0,b1,b2,b3,b4];
float D; /* ユークリッド距離 */
とすると、いちいち
float POW = 0;
for (n=0;n<5;n++)
POW = POW + pow((a[n]-b[n])^2);
D = Sqr(POW);
などとやらないといけないのでしょうか?
もっと、一発で決まる関数なんかは無いのでしょうか?
一発物はないです。
template <typename T> struct DoubledDistance : public std::binary_function<T, T,
T> {
T operator() (const T & lhs, const T & rhs) const {
return std::pow((lhs - rhs), T(2.0));
}
};
template <typename InIter1, typename InIter2> typename
std::iterator_traits<InIter1>::value_type Distance (InIter1 first1, InIter1
last1, InIter2 first2)
{
typedef typename std::iterator_traits<InIter1>::value_type value;
return std::sqrt(std::inner_product(first1, last1, first2, value(),
std::plus<value>(), DoubledDistance<value>());
}
なんてのを用意してやれば,Distanceの呼び出し一発になりますが。
ただし,テンプレート機能がダメダメなVisual C++ではstd::iteratr_traitsの特殊化が
できないので
std::iterator_traits<float *>などが用意されていません。
というわけで,その辺りは自分で別途特殊化しておく必要があります。
#std:powとかstd::sqrtとかも通らないね……。
いちいちやらなくても、
float norm(float* a, float* b, int n)
{
int i;
double d = 0.0;
for (i=0 ; i<n ; i++) {
d += (a[i] - b[i])*(a[i] - b[i]);
}
return sqrt(d);
}
のような関数を自分で作ってしまえばいいです。
行列やベクトル演算用のライブラリでも探してくれば
一発で出来る関数が用意されているかもしれませんが、
そこまでする必要もないですよね?