Ignore:
Timestamp:
07/22/2009 10:59:15 AM (11 years ago)
Author:
dave
Message:

PCA updated - projection and resynthesis seem to work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • foam/trunk/vision/src/PCA.cpp

    r89 r90  
    3535{ 
    3636        // calculate the mean 
    37         Vector<float> Mean(m_FeatureSize); 
    38         Mean.Zero(); 
     37        m_Mean.Zero(); 
    3938        for (FeatureVec::iterator vi = m_Features.begin(); vi!=m_Features.end(); ++vi) 
    4039        { 
    41                 Mean+=*vi; 
     40                m_Mean+=*vi; 
    4241        } 
    4342         
    44         Mean/=m_Features.size(); 
     43        m_Mean/=m_Features.size(); 
    4544                 
    4645        // subtract the mean 
     
    4847        for (FeatureVec::iterator vi = m_Features.begin(); vi!=m_Features.end(); ++vi) 
    4948        { 
    50                 SubMean.push_back(*vi-Mean); 
     49                SubMean.push_back(*vi-m_Mean); 
    5150        } 
    5251         
     
    7069        } 
    7170        m_EigenValues = SVD(m_EigenTransform); 
     71        m_EigenTransform=m_EigenTransform.Transposed(); 
     72} 
     73 
     74void PCA::Compress(unsigned int s, unsigned int e) 
     75{ 
     76        m_EigenTransform=m_EigenTransform.CropRows(s,e); 
     77} 
     78 
     79Vector<float> PCA::Project(Vector<float> v) 
     80{ 
     81        return m_EigenTransform*v; 
     82} 
     83         
     84Vector<float> PCA::Synth(Vector<float> v) 
     85{ 
     86        return m_Mean+m_EigenTransform.VecMulTransposed(v); 
     87} 
     88 
     89void PCA::Save(FILE *f) 
     90{ 
     91        int version = 2; 
     92        fwrite(&version,sizeof(version),1,f); 
     93        m_EigenTransform.Save(f); 
     94        m_EigenValues.Save(f); 
     95        m_Mean.Save(f); 
     96        fwrite(&m_FeatureSize,sizeof(m_FeatureSize),1,f); 
     97        for (unsigned int i=0; i<m_Features.size(); i++) 
     98        { 
     99                m_Features[i].Save(f); 
     100        } 
     101         
     102} 
     103 
     104void PCA::Load(FILE *f) 
     105{ 
     106        int version;     
     107        fread(&version,sizeof(version),1,f); 
     108        m_EigenTransform.Load(f); 
     109        m_EigenValues.Load(f); 
     110         
     111        if (version == 1) 
     112        { 
     113                m_EigenTransform=m_EigenTransform.Transposed(); 
     114        } 
     115         
     116        if (version>1)  
     117        { 
     118                m_Mean.Load(f);  
     119                fread(&m_FeatureSize,sizeof(m_FeatureSize),1,f); 
     120                for (unsigned int i=0; i<m_Features.size(); i++) 
     121                { 
     122                        m_Features[i].Load(f); 
     123                } 
     124        } 
    72125} 
    73126 
    74127void PCA::RunTests() 
    75128{ 
     129        Matrix<float>::RunTests(); 
    76130        PCA pca(2); 
    77131         
     
    99153         
    100154        pca.Calculate(); 
     155                 
     156        in[0]=.69; in[1]=.49; 
     157        Vector<float> out = pca.Project(in); 
     158        assert(feq(out[0],-0.82797f) && feq(out[1],-0.175115f)); 
     159         
    101160} 
    102161 
Note: See TracChangeset for help on using the changeset viewer.