解析


ベクトルクラスを紹介しています。ベクトル同士の演算などを定義しています。

		
public class Vector
{
  /// <summary>エレメント値の配列</summary>
  public double[] Values
  {
    get
    {
      return _elements;
    }
    set
    {
      _elements = value;
    }
  }
  protected double[] _elements;

  /// <summary>コンストラクタ</summary>
  public Vector()
  {
    _elements = new double[ 0 ];
  }
  /// <summary>コンストラクタ</summary>
  public Vector( params double[] data )
  {
    _elements = new double[ data.Length ];
    for( int i = 0; i < data.Length; i++ )
    {
      _elements[ i ] = data[ i ];
    }
  }
  /// <summary>コンストラクタ</summary>
  /// <param name="nElementCount">次元数</param>
  public Vector( int nElementCount )
  {
    _elements = new double[ nElementCount ];
  }
  /// <summary>次元数</summary>
  public int Count
  {
    get
    {
      return _elements.Length;
    }
  }
  /// <summary>インデクサ。次元に対応する値を取得、設定</summary>
  public double this[ int nIndex ]
  {
    get
    {
      return _elements[ nIndex ];
    }
    set
    {
      _elements[ nIndex ] = value;
    }
  }

  /// <summary>クローン作成</summary>
  /// <returns>クローン</returns>
  public virtual object Clone()
  {
    return this.MemberwiseClone();
  }

  /// <summary>本ベクトルの長さを返す。</summary>
  /// <returns>距離</returns>
  public double GetDistance()
  {
    // 本ベクトルとゼロベクトル間の距離を計算
    return GetDistance( new Vector( this.Count ) );
  }

  /// <summary>本ベクトルから指定のベクトル間の距離を測定</summary>
  /// <param name="dat">指定のベクトル</param>
  /// <returns>距離</returns>
  public double GetDistance( Vector dat )
  {
    if( this.Count != dat.Count ) return 0;

    double dDistance = 0;
    for( int i = 0; i < dat.Count; i++ )
    {
      dDistance += Math.Pow( _elements[ i ] - dat[ i ], 2 );
    }
    return Math.Sqrt( dDistance );
  }
  /// <summary>平均取得</summary>
  /// <returns>平均</returns>
  public double Average
  {
    get
    {
      double dAvrage = 0;
      for( int i = 0; i < this.Count; i++ )
      {
        dAvrage += this[ i ];
      }
      return dAvrage / this.Count;
    }
  }
  /// <summary>分散取得</summary>
  /// <returns>分散</returns>
  public double Variance
  {
    get
    {
      // 分散
      double dAverage = this.Average;
      double dVariance = 0.0;
      foreach( double value in _elements )
      {
        dVariance += Math.Pow( ( value - dAverage ), 2 );
      }
      return dVariance / this.Count;
    }
  }
  /// <summary>規格化</summary>
  /// <returns><para>True: OK</para><para>False: NG</para></returns>
  public bool Normalize()
  {
    double dAverage = this.Average;
    double dDeviation = Math.Sqrt( this.Variance );
    for( int i = 0; i < this.Count; i++ )
    {
      this[ i ] = ( this[ i ] - dAverage ) / dDeviation;
    }
    return true;
  }
  /// <summary>イテレータ取得</summary>
  /// <returns>イテレータ</returns>
  public IEnumerator<double> GetEnumerator()
  {
    for( int i = 0; i < _elements.Length; i++ )
    {
      yield return _elements[ i ];
    }
  }
  /// <summary>文字列表現を取得</summary>
  /// <returns>文字列表現</returns>
  public override string ToString()
  {
    StringBuilder szText = new StringBuilder();
    szText.Append( "(" );
    for( int i = 0; i < this.Count; i++ )
    {
      szText.Append( this[ i ].ToString( "F" ) );
      szText.Append( ',' );
    }
    szText = szText.Remove( szText.Length - 1, 1 );
    szText.Append( ")" );
    return szText.ToString();
  }
  #region Operator

  /// <summary>ベクトルの和</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dat2">指定のベクトル</param>
  /// <returns>結果ベクトル</returns>
  public static Vector operator +( Vector dat1, Vector dat2 )
  {
    if( dat1.Count != dat2.Count ) return null;

    Vector ret = ( Vector )dat1.Clone();
    for( int i = 0; i < dat1.Count; i++ )
    {
      ret[ i ] = dat1[ i ] + dat2[ i ];
    }
    return ret;
  }

  /// <summary>ベクトルの和拡大</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dDat">拡大率</param>
  /// <returns>結果ベクトル</returns>
  public static Vector operator +( Vector dat1, double dDat )
  {
    Vector ret = ( Vector )dat1.Clone();
    for( int i = 0; i < dat1.Count; i++ )
    {
      ret[ i ] = dat1[ i ] + dDat;
    }
    return ret;
  }
  /// <summary>ベクトルの差</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dat2">指定のベクトル</param>
  /// <returns>結果ベクトル</returns>
  public static Vector operator -( Vector dat1, Vector dat2 )
  {
    if( dat1.Count != dat2.Count ) return null;

    Vector ret = ( Vector )dat1.Clone();
    for( int i = 0; i < dat1.Count; i++ )
    {
      ret[ i ] = dat1[ i ] - dat2[ i ];
    }
    return ret;
  }
  /// <summary>ベクトルの差拡大</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dDat">拡大率</param>
  /// <returns>結果ベクトル</returns>
  public static Vector operator -( Vector dat1, double dDat )
  {
    Vector ret = ( Vector )dat1.Clone();
    for( int i = 0; i < dat1.Count; i++ )
    {
      ret[ i ] = dat1[ i ] - dDat;
    }
    return ret;
  }
  /// <summary>内積</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dat2">指定のベクトル</param>
  /// <returns>内積</returns>
  public static double operator *( Vector dat1, Vector dat2 )
  {
    if( dat1.Count != dat2.Count ) return 0;

    double dProduct = 0;
    for( int i = 0; i < dat1.Count; i++ )
    {
      dProduct += dat1[ i ] * dat2[ i ];
    }
    return dProduct;
  }
  /// <summary>ベクトルの積拡大</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dDat">拡大率</param>
  /// <returns>結果ベクトル</returns>
  public static Vector operator *( Vector dat1, double dDat )
  {
    Vector ret = ( Vector )dat1.Clone();
    for( int i = 0; i < dat1.Count; i++ )
    {
      ret[ i ] = dat1[ i ] * dDat;
    }
    return ret;
  }
  /// <summary>ベクトルの商拡大</summary>
  /// <param name="dat1">指定のベクトル</param>
  /// <param name="dDat">拡大率</param>
  /// <returns>結果ベクトル</returns>
  public static Vector operator /( Vector dat1, double dDat )
  {
    Vector ret = ( Vector )dat1.Clone();
    for( int i = 0; i < dat1.Count; i++ )
    {
      ret[ i ] = dat1[ i ] / dDat;
    }
    return ret;
  }
  #endregion
}
		
	


inserted by FC2 system