本文整理汇总了C++中SiconosVector::dense方法的典型用法代码示例。如果您正苦于以下问题:C++ SiconosVector::dense方法的具体用法?C++ SiconosVector::dense怎么用?C++ SiconosVector::dense使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SiconosVector
的用法示例。
在下文中一共展示了SiconosVector::dense方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: toBlock
void SiconosVector::toBlock(SiconosVector& vOut, unsigned int sizeB, unsigned int startIn, unsigned int startOut) const
{
// To copy a subBlock of the vector (from position startIn to startIn+sizeB) into vOut (from pos. startOut to startOut+sizeB).
// Check dim ...
assert(startIn < size() && "vector toBlock(v1,v2,...): start position in input vector is out of range.");
assert(startOut < vOut.size() && "vector toBlock(v1,v2,...): start position in output vector is out of range.");
assert(startIn + sizeB <= size() && "vector toBlock(v1,v2,...): end position in input vector is out of range.");
assert(startOut + sizeB <= vOut.size() && "vector toBlock(v1,v2,...): end position in output vector is out of range.");
unsigned int endOut = startOut + sizeB;
unsigned int numIn = num();
unsigned int numOut = vOut.num();
if (numIn == numOut)
{
if (numIn == 1) // vIn / vOut are Dense
noalias(ublas::subrange(*vOut.dense(), startOut, endOut)) = ublas::subrange(*vect.Dense, startIn, startIn + sizeB);
else // if(numIn == 4)// vIn / vOut are Sparse
noalias(ublas::subrange(*vOut.sparse(), startOut, endOut)) = ublas::subrange(*vect.Sparse, startIn, startIn + sizeB);
}
else // vIn and vout of different types ...
{
if (numIn == 1) // vIn Dense
noalias(ublas::subrange(*vOut.sparse(), startOut, endOut)) = ublas::subrange(*vect.Dense, startIn, startIn + sizeB);
else // if(numIn == 4)// vIn Sparse
noalias(ublas::subrange(*vOut.dense(), startOut, endOut)) = ublas::subrange(*vect.Sparse, startIn, startIn + sizeB);
}
}
示例2: SolveByLeastSquares
void SimpleMatrix::SolveByLeastSquares(SiconosVector &B)
{
if (B.isBlock())
SiconosMatrixException::selfThrow("SimpleMatrix::SolveByLeastSquares(SiconosVector &B) failed. Not yet implemented for V being a BlockVector.");
DenseMat tmpB(B.size(), 1);
ublas::column(tmpB, 0) = *(B.dense()); // Conversion of vector to matrix. Temporary solution.
int info = 0;
#ifdef USE_OPTIMAL_WORKSPACE
info += lapack::gels(*mat.Dense, tmpB, lapack::optimal_workspace());
#endif
#ifdef USE_MINIMAL_WORKSPACE
info += lapack::gels(*mat.Dense, tmpB, lapack::minimal_workspace());
#endif
if (info != 0)
{
std::cout << "info = " << info << std::endl;
SiconosMatrixException::selfThrow("SimpleMatrix::SolveByLeastSquares failed.");
}
else
{
noalias(*(B.dense())) = ublas::column(tmpB, 0);
}
}
示例3: PLUForwardBackwardInPlace
void SimpleMatrix::PLUForwardBackwardInPlace(SiconosVector &B)
{
if (B.isBlock())
SiconosMatrixException::selfThrow("SimpleMatrix PLUForwardBackwardInPlace(V) failed. Not yet implemented for V being a BlockVector.");
DenseMat tmpB(B.size(), 1);
ublas::column(tmpB, 0) = *(B.dense()); // Conversion of vector to matrix. Temporary solution.
int info;
if (_num == 1)
{
if (!_isPLUFactorized) // call gesv => LU-factorize+solve
{
// solve system:
if (!_ipiv)
_ipiv.reset(new VInt(size(0)));
else
_ipiv->resize(size(0));
info = lapack::gesv(*mat.Dense, *_ipiv, tmpB);
_isPLUFactorized = true;
/*
ublas::matrix<double> COPY(*mat.Dense);
ublas::vector<double> S(std::max(size(0),size(1)));
ublas::matrix<double, ublas::column_major> U(size(0),size(1));
ublas::matrix<double, ublas::column_major> VT(size(0),size(1));
int ierr = lapack::gesdd(COPY, S, U, VT);
printf("info = %d, ierr = %d, emax = %f, emin = %f , cond = %f\n",info,ierr,S(0),S(2),S(0)/S(2));
*/
// B now contains solution:
}
else // call getrs: only solve using previous lu-factorization
info = lapack::getrs(*mat.Dense, *_ipiv, tmpB);
}
else
{
if (!_isPLUFactorized) // call first PLUFactorizationInPlace
{
PLUFactorizationInPlace();
}
// and then solve
inplace_solve(*sparse(), tmpB, ublas::lower_tag());
inplace_solve(ublas::trans(*sparse()), tmpB, ublas::upper_tag());
info = 0;
}
if (info != 0)
SiconosMatrixException::selfThrow("SimpleMatrix::PLUForwardBackwardInPlace failed.");
else
{
noalias(*(B.dense())) = ublas::column(tmpB, 0);
}
}
示例4: subBlock
void SiconosVector::subBlock(unsigned int index, const SiconosVector& vIn)
{
// Add vIn from the current vector, starting from position "index".
// vIn may be a BlockVector.
// if ( num != 1 ) SiconosVectorException::selfThrow("SiconosVector::subBlock : vector should be dense");
unsigned int end = vIn.size();
if ((index + end) > size()) SiconosVectorException::selfThrow("SiconosVector::subBlock : invalid ranges");
unsigned int numVin = vIn.num();
if (numVin != num()) SiconosVectorException::selfThrow("SiconosVector::subBlock : inconsistent types.");
if (_dense)
noalias(ublas::subrange(*vect.Dense, index, index + end)) -= *vIn.dense();
else
noalias(ublas::subrange(*vect.Sparse, index, index + end)) -= *vIn.sparse();
}
示例5: setBlock
void SiconosVector::setBlock(unsigned int index, const SiconosVector& vIn)
{
// Set current vector elements, starting from position "index", to the values of vector vIn
// Exceptions ...
assert(&vIn != this && "SiconosVector::this->setBlock(pos,vIn): vIn = this.");
assert(index < size() && "SiconosVector::setBlock : invalid ranges");
unsigned int end = vIn.size() + index;
assert(end <= size() && "SiconosVector::setBlock : invalid ranges");
assert (vIn.num() == num() && "SiconosVector::setBlock: inconsistent types.");
if (_dense)
noalias(ublas::subrange(*vect.Dense, index, end)) = *vIn.dense();
else
noalias(ublas::subrange(*vect.Sparse, index, end)) = *vIn.sparse();
}
示例6: DenseVect
// Copy
SiconosVector::SiconosVector(const SiconosVector &svect) : std11::enable_shared_from_this<SiconosVector>()
{
if (ask<IsDense>(svect)) // dense
{
_dense = true;
vect.Dense = new DenseVect(svect.size());
noalias(*vect.Dense) = (*svect.dense());
// std::copy((vect.Dense)->begin(), (vect.Dense)->end(), (svect.dense())->begin());
}
else //sparse
{
_dense = false;
vect.Sparse = new SparseVect(svect.size());
noalias(*vect.Sparse) = (*svect.sparse());
//std::copy((vect.Sparse)->begin(), (vect.Sparse)->end(), (svect.sparse())->begin());
}
// Note FP: using constructor + noalias = (or std::copy) is more
// efficient than a call to ublas::vector copy constructor, this for
// large or small vectors.
}
示例7: private_addprod
void private_addprod(const SiconosMatrix& A, unsigned startRow, unsigned int startCol, const SiconosVector& x, SiconosVector& y)
{
assert(!(A.isPLUFactorized()) && "A is PLUFactorized in prod !!");
assert(!A.isBlock() && "private_addprod(A,start,x,y) error: not yet implemented for block matrix.");
// we take a submatrix subA of A, starting from row startRow to row (startRow+sizeY) and between columns startCol and (startCol+sizeX).
// Then computation of y = subA*x + y.
unsigned int numA = A.getNum();
unsigned int numY = y.getNum();
unsigned int numX = x.getNum();
unsigned int sizeX = x.size();
unsigned int sizeY = y.size();
assert(numX == numY && "private_addprod(A,start,x,y) error: not yet implemented for x and y of different types.");
if (numY == 1 && numX == 1)
{
assert(y.dense() != x.dense());
if (numA == 1)
noalias(*y.dense()) += prod(ublas::subrange(*A.dense(), startRow, startRow + sizeY, startCol, startCol + sizeX), *x.dense());
else if (numA == 2)
noalias(*y.dense()) += prod(ublas::subrange(*A.triang(), startRow, startRow + sizeY, startCol, startCol + sizeX), *x.dense());
else if (numA == 3)
noalias(*y.dense()) += prod(ublas::subrange(*A.sym(), startRow, startRow + sizeY, startCol, startCol + sizeX), *x.dense());
else if (numA == 4)
noalias(*y.dense()) += prod(ublas::subrange(*A.sparse(), startRow, startRow + sizeY, startCol, startCol + sizeX), *x.dense());
else //if(numA==5)
noalias(*y.dense()) += prod(ublas::subrange(*A.banded(), startRow, startRow + sizeY, startCol, startCol + sizeX), *x.dense());
}
else // x and y sparse
{
if (numA == 4)
*y.sparse() += prod(ublas::subrange(*A.sparse(), startRow, startRow + sizeY, startCol, startCol + sizeX), *x.sparse());
else
SiconosMatrixException::selfThrow("private_addprod(A,start,x,y) error: not yet implemented for x, y sparse and A not sparse.");
}
}