Go to the documentation of this file.00001
00002 #include <Eigen/Sparse>
00003 #include <bench/BenchTimer.h>
00004 #include <set>
00005
00006 using namespace std;
00007 using namespace Eigen;
00008 using namespace Eigen;
00009
00010 #ifndef SIZE
00011 #define SIZE 1024
00012 #endif
00013
00014 #ifndef DENSITY
00015 #define DENSITY 0.01
00016 #endif
00017
00018 #ifndef SCALAR
00019 #define SCALAR double
00020 #endif
00021
00022 typedef SCALAR Scalar;
00023 typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix;
00024 typedef Matrix<Scalar,Dynamic,1> DenseVector;
00025 typedef SparseMatrix<Scalar> EigenSparseMatrix;
00026
00027 void fillMatrix(float density, int rows, int cols, EigenSparseMatrix& dst)
00028 {
00029 dst.reserve(rows*cols*density);
00030 for(int j = 0; j < cols; j++)
00031 {
00032 for(int i = 0; i < rows; i++)
00033 {
00034 Scalar v = (internal::random<float>(0,1) < density) ? internal::random<Scalar>() : 0;
00035 if (v!=0)
00036 dst.insert(i,j) = v;
00037 }
00038 }
00039 dst.finalize();
00040 }
00041
00042 void fillMatrix2(int nnzPerCol, int rows, int cols, EigenSparseMatrix& dst)
00043 {
00044
00045 dst.reserve(nnzPerCol*cols);
00046 for(int j = 0; j < cols; j++)
00047 {
00048 std::set<int> aux;
00049 for(int i = 0; i < nnzPerCol; i++)
00050 {
00051 int k = internal::random<int>(0,rows-1);
00052 while (aux.find(k)!=aux.end())
00053 k = internal::random<int>(0,rows-1);
00054 aux.insert(k);
00055
00056 dst.insert(k,j) = internal::random<Scalar>();
00057 }
00058 }
00059 dst.finalize();
00060 }
00061
00062 void eiToDense(const EigenSparseMatrix& src, DenseMatrix& dst)
00063 {
00064 dst.setZero();
00065 for (int j=0; j<src.cols(); ++j)
00066 for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
00067 dst(it.index(),j) = it.value();
00068 }
00069
00070 #ifndef NOGMM
00071 #include "gmm/gmm.h"
00072 typedef gmm::csc_matrix<Scalar> GmmSparse;
00073 typedef gmm::col_matrix< gmm::wsvector<Scalar> > GmmDynSparse;
00074 void eiToGmm(const EigenSparseMatrix& src, GmmSparse& dst)
00075 {
00076 GmmDynSparse tmp(src.rows(), src.cols());
00077 for (int j=0; j<src.cols(); ++j)
00078 for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
00079 tmp(it.index(),j) = it.value();
00080 gmm::copy(tmp, dst);
00081 }
00082 #endif
00083
00084 #ifndef NOMTL
00085 #include <boost/numeric/mtl/mtl.hpp>
00086 typedef mtl::compressed2D<Scalar, mtl::matrix::parameters<mtl::tag::col_major> > MtlSparse;
00087 typedef mtl::compressed2D<Scalar, mtl::matrix::parameters<mtl::tag::row_major> > MtlSparseRowMajor;
00088 void eiToMtl(const EigenSparseMatrix& src, MtlSparse& dst)
00089 {
00090 mtl::matrix::inserter<MtlSparse> ins(dst);
00091 for (int j=0; j<src.cols(); ++j)
00092 for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
00093 ins[it.index()][j] = it.value();
00094 }
00095 #endif
00096
00097 #ifdef CSPARSE
00098 extern "C" {
00099 #include "cs.h"
00100 }
00101 void eiToCSparse(const EigenSparseMatrix& src, cs* &dst)
00102 {
00103 cs* aux = cs_spalloc (0, 0, 1, 1, 1);
00104 for (int j=0; j<src.cols(); ++j)
00105 for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
00106 if (!cs_entry(aux, it.index(), j, it.value()))
00107 {
00108 std::cout << "cs_entry error\n";
00109 exit(2);
00110 }
00111 dst = cs_compress(aux);
00112
00113 }
00114 #endif // CSPARSE
00115
00116 #ifndef NOUBLAS
00117 #include <boost/numeric/ublas/vector.hpp>
00118 #include <boost/numeric/ublas/matrix.hpp>
00119 #include <boost/numeric/ublas/io.hpp>
00120 #include <boost/numeric/ublas/triangular.hpp>
00121 #include <boost/numeric/ublas/vector_sparse.hpp>
00122 #include <boost/numeric/ublas/matrix_sparse.hpp>
00123 #include <boost/numeric/ublas/vector_of_vector.hpp>
00124 #include <boost/numeric/ublas/operation.hpp>
00125
00126
00127
00128
00129
00130
00131 typedef boost::numeric::ublas::compressed_matrix<Scalar,boost::numeric::ublas::column_major> UblasMatrix;
00132
00133 void eiToUblas(const EigenSparseMatrix& src, UblasMatrix& dst)
00134 {
00135 for (int j=0; j<src.cols(); ++j)
00136 for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
00137 dst(it.index(),j) = it.value();
00138 }
00139
00140
00141 #endif
00142
00143 #ifdef OSKI
00144 extern "C" {
00145 #include <oski/oski.h>
00146 }
00147 #endif