1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


7  * HeuristicLab is free software: you can redistribute it and/or modify


8  * it under the terms of the GNU General Public License as published by


9  * the Free Software Foundation, either version 3 of the License, or


10  * (at your option) any later version.


11  *


12  * HeuristicLab is distributed in the hope that it will be useful,


13  * but WITHOUT ANY WARRANTY; without even the implied warranty of


14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


15  * GNU General Public License for more details.


16  *


17  * You should have received a copy of the GNU General Public License


18  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


19  */


20  #endregion


21 


22  using System.Collections.Generic;


23  using System.Linq;


24 


25  namespace HeuristicLab.Algorithms.DataAnalysis {


26  public static class Util {


27  public static double ScalarProd(IEnumerable<double> v, IEnumerable<double> u) {


28  return v.Zip(u, (vi, ui) => vi * ui).Sum();


29  }


30 


31  public static double SqrDist(double x, double y) {


32  double d = x  y;


33  return d * d;


34  }


35 


36  public static double SqrDist(IEnumerable<double> x, IEnumerable<double> y) {


37  return x.Zip(y, (a, b) => (a  b) * (a  b)).Sum();


38  }


39 


40  public static double SqrDist(double[,] x, int i, int j, double scale = 1.0) {


41  return SqrDist(x, i, x, j, scale);


42  }


43 


44  public static double SqrDist(double[,] x, int i, double[,] xt, int j, double scale = 1.0) {


45  double ss = 0.0;


46  for (int k = 0; k < x.GetLength(1); k++) {


47  double d = x[i, k]  xt[j, k];


48  ss += d * d;


49  }


50  return scale * scale * ss;


51  }


52  public static double SqrDist(double[,] x, int i, int j, double[] scale) {


53  return SqrDist(x, i, x, j, scale);


54  }


55 


56  public static double SqrDist(double[,] x, int i, double[,] xt, int j, double[] scale) {


57  double ss = 0.0;


58  for (int k = 0; k < x.GetLength(1); k++) {


59  double d = x[i, k]  xt[j, k];


60  ss += d * d * scale[k] * scale[k];


61  }


62  return ss;


63  }


64 


65  public static IEnumerable<double> GetRow(double[,] x, int r) {


66  int cols = x.GetLength(1);


67  return Enumerable.Range(0, cols).Select(c => x[r, c]);


68  }


69  public static IEnumerable<double> GetCol(double[,] x, int c) {


70  int rows = x.GetLength(0);


71  return Enumerable.Range(0, rows).Select(r => x[r, c]);


72  }


73  }


74  }

