Skip to content
Snippets Groups Projects
svdtest.cc 1.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <iostream>
    
    #include <dune/gfe/svd.hh>
    
    #include "multiindex.hh"
    
    using namespace Dune;
    
    int main()
    {
        const int N=3;
        const int M=3;
        
        FieldMatrix<double,N,M> testMatrix;
    
        int nTestValues = 5;
        double maxDiff = 0;
        
    
        MultiIndex index(N*M, nTestValues);
    
        int numIndices = index.cycle();
        
        for (int i=0; i<numIndices; i++, ++index) {
            
            for (int j=0; j<N; j++)
                for (int k=0; k<M; k++) {
                    testMatrix[j][k] = std::exp(double(2*index[j*M+k]-double(nTestValues))) - std::exp(double(nTestValues));
                    //std::cout << std::exp(2*index[j*M+k]-double(nTestValues)) << std::endl;
                }
            //std::cout << "testMatrix:\n" << testMatrix << std::endl;
            //exit(0);
            FieldVector<double,N> w;
            FieldMatrix<double,N,N> v;
            
            FieldMatrix<double,N,M> testMatrixBackup = testMatrix;
            svdcmp(testMatrix,w,v);
            
            // Multiply the three matrices to see whether we get the original one back
            FieldMatrix<double,N,M> product(0);
            
            for (int j=0; j<N; j++)
                for (int k=0; k<M; k++)
                    for (int l=0; l<N; l++)
                        product[j][k] += testMatrix[j][l] * w[l] * v[k][l];
            
            product -= testMatrixBackup;
            //std::cout << product << std::endl;
            if (maxDiff < product.infinity_norm()) {
                maxDiff = product.infinity_norm();
                std::cout << "max diff: " << maxDiff << std::endl;
                std::cout << "testMatrix:\n" << testMatrixBackup << std::endl;
                std::cout << "difference:\n" << product << std::endl;
                exit(0);
            }
        
        }
        
    }