おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

角度の平均の計算方法

プログラム書いてて、ちょっとぶち当たったテーマですが、調べたらあっさり出てきてナルホド~と思ったのでメモッときます。

そのまま角度を足して総数で割ってはいけないのは、例えば 3°と-3°の角度の平均は0°ですが、3°と357°の平均は180°ではないから明らかですね。
参考にさせていただいたページ(産総研の中のページですね)より

”単位ベクトル合算法”というのが良さそうです。 「角度→その角度を持った単位ベクトル」と変換して、変換されたベクトルを足していくと長~いベクトルが得られます。その長~いベクトルの偏角が角度の平均ということです。ナルホド。

ただし、”データの角度が揃っていないと、回答が不安定になりがち”らしく、たぶん極端な例として0°と180°の平均をこの方法で求めようとすると、偏角を求めたいベクトルがゼロベクトルになってしまってうまく求められないということだと思います。そもそも、0°と180°の平均って90°それとも270°?って疑問もありますが。

この方法は、角度に限らず周期性のあるデータの平均を求めるときにも使えそうですね。「周期データ→位相みたいなもの(角度)→平均とる」という感じで。(というか、実は元々そのつもりなんですけどね)
続きの内容はサンプルソースですよ。
#define _USE_MATH_DEFINES
#include <iostream>
#include <vector>
#include <complex>
#include <exception>

// Return value is in range (period/2, period/2]
template <typename Iterator>
typename Iterator::value_type cyclic_average(
  Iterator b, Iterator e,
  typename Iterator::value_type const &period, typename Iterator::value_type const &epsilon = 0)
{
  typedef typename Iterator::value_type T;

  std::complex<T> v(0, 0);
  for ( ; b != e; ++b)
  {
    T phase = (*b) * 2 * M_PI / period;
    v += std::complex<T>(std::cos(phase), std::sin(phase));
  }

  if (std::norm(v) <= epsilon) throw std::runtime_error("Failed to calculate cyclic average");
  
  return std::arg(v) * period / 2 / M_PI;
}

int main()
{
  try
  {
    std::vector<double> angles;
    angles.push_back(3.0);
    angles.push_back(358.0);
    //angles.push_back(183.0);
    
    double average = cyclic_average(angles.begin(), angles.end(), 360.0, 1e-4);
    
    std::cout << "average = " << average << std::endl;
  }
  catch (std::exception &ex)
  {
    std::cerr << "Error: " << ex.what() << std::endl;
  }

  return 0;
}
  1. 2008/02/12(火) 19:39:15|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
<<Cairo の TextExtents のメモ | ホーム | GTK+ の cairo を最新版にする@Windows>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/212-05783364
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。