1 | // Copyright (C) 2009 foam |
---|

2 | // |
---|

3 | // This program is free software; you can redistribute it and/or modify |
---|

4 | // it under the terms of the GNU General Public License as published by |
---|

5 | // the Free Software Foundation; either version 2 of the License, or |
---|

6 | // (at your option) any later version. |
---|

7 | // |
---|

8 | // This program is distributed in the hope that it will be useful, |
---|

9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|

10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|

11 | // GNU General Public License for more details. |
---|

12 | // |
---|

13 | // You should have received a copy of the GNU General Public License |
---|

14 | // along with this program; if not, write to the Free Software |
---|

15 | // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
---|

16 | |
---|

17 | #include <vector> |
---|

18 | #include <map> |
---|

19 | #include <set> |
---|

20 | #include "Vector.h" |
---|

21 | #include "Matrix.h" |
---|

22 | #include "Classifier.h" |
---|

23 | |
---|

24 | #ifndef FOAM_PCA |
---|

25 | #define FOAM_PCA |
---|

26 | |
---|

27 | // Principle component analysis |
---|

28 | |
---|

29 | class PCA |
---|

30 | { |
---|

31 | public: |
---|

32 | PCA(unsigned int FeatureSize); |
---|

33 | ~PCA(); |
---|

34 | |
---|

35 | typedef std::vector<Vector<float> > FeatureVec; |
---|

36 | |
---|

37 | void AddFeature(Vector<float> v) { m_Features.push_back(v); } |
---|

38 | void Calculate(); |
---|

39 | |
---|

40 | // remove eigenvectors from the transform |
---|

41 | void Compress(unsigned int s, unsigned int e); |
---|

42 | |
---|

43 | void Mult(const PCA &other); |
---|

44 | |
---|

45 | Vector<float> Project(Vector<float> v) const; |
---|

46 | Vector<float> Synth(Vector<float> v) const; |
---|

47 | |
---|

48 | static void RunTests(); |
---|

49 | |
---|

50 | const Vector<float> &GetEigenValues() const { return m_EigenValues; } |
---|

51 | const Matrix<float> &GetEigenTransform() const { return m_EigenTransform; } |
---|

52 | const FeatureVec &GetFeatures() const { return m_Features; } |
---|

53 | const Vector<float> &GetMean() const { return m_Mean; } |
---|

54 | unsigned int GetFeatureSize() const { return m_FeatureSize; } |
---|

55 | unsigned int GetParamsSize() const { return m_EigenTransform.GetRows(); } |
---|

56 | |
---|

57 | |
---|

58 | void Load(FILE *f); |
---|

59 | void Save(FILE *f); |
---|

60 | |
---|

61 | private: |
---|

62 | |
---|

63 | void CalcMean(); |
---|

64 | |
---|

65 | |
---|

66 | FeatureVec m_Features; |
---|

67 | unsigned int m_FeatureSize; |
---|

68 | Vector<float> m_Mean; |
---|

69 | |
---|

70 | Vector<float> m_EigenValues; |
---|

71 | Matrix<float> m_EigenTransform; |
---|

72 | |
---|

73 | }; |
---|

74 | |
---|

75 | #endif |
---|