// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr> // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
/* Initializes both a sparse and dense matrix with same random values, * and a ratio of \a density non zero entries. * \param flags is a union of ForceNonZeroDiag, MakeLowerTriangular and MakeUpperTriangular * allowing to control the shape of the matrix. * \param zeroCoords and nonzeroCoords allows to get the coordinate lists of the non zero, * and zero coefficients respectively.
*/ template<typename Scalar,int Opt1,int Opt2,typename StorageIndex> void
initSparse(double density,
Matrix<Scalar,Dynamic,Dynamic,Opt1>& refMat,
SparseMatrix<Scalar,Opt2,StorageIndex>& sparseMat, int flags = 0,
std::vector<Matrix<StorageIndex,2,1> >* zeroCoords = 0,
std::vector<Matrix<StorageIndex,2,1> >* nonzeroCoords = 0)
{ enum { IsRowMajor = SparseMatrix<Scalar,Opt2,StorageIndex>::IsRowMajor };
sparseMat.setZero(); //sparseMat.reserve(int(refMat.rows()*refMat.cols()*density));
sparseMat.reserve(VectorXi::Constant(IsRowMajor ? refMat.rows() : refMat.cols(), int((1.5*density)*(IsRowMajor?refMat.cols():refMat.rows()))));
for(Index j=0; j<sparseMat.outerSize(); j++)
{ //sparseMat.startVec(j); for(Index i=0; i<sparseMat.innerSize(); i++)
{
Index ai(i), aj(j); if(IsRowMajor)
std::swap(ai,aj);
Scalar v = (internal::random<double>(0,1) < density) ? internal::random<Scalar>() : Scalar(0); if ((flags&ForceNonZeroDiag) && (i==j))
{ // FIXME: the following is too conservative
v = internal::random<Scalar>()*Scalar(3.);
v = v*v; if(numext::real(v)>0) v += Scalar(5); else v -= Scalar(5);
} if ((flags & MakeLowerTriangular) && aj>ai)
v = Scalar(0); elseif ((flags & MakeUpperTriangular) && aj<ai)
v = Scalar(0);
if ((flags&ForceRealDiag) && (i==j))
v = numext::real(v);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.