ベクトルの距離演算を簡単に求める方法はないのでしょうか? – プログラミング – Home

ベクトルの距離演算を簡単に求める方法は...
 
通知
すべてクリア

ベクトルの距離演算を簡単に求める方法はないのでしょうか?


質問
 質問
(@質問)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

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);
などとやらないといけないのでしょうか?

もっと、一発で決まる関数なんかは無いのでしょうか?


引用解決済
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

一発物はないです。
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とかも通らないね……。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

いちいちやらなくても、
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);
}
のような関数を自分で作ってしまえばいいです。

行列やベクトル演算用のライブラリでも探してくれば
一発で出来る関数が用意されているかもしれませんが、
そこまでする必要もないですよね?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました