本文整理汇总了C++中SiconosMatrix::isPLUFactorized方法的典型用法代码示例。如果您正苦于以下问题:C++ SiconosMatrix::isPLUFactorized方法的具体用法?C++ SiconosMatrix::isPLUFactorized怎么用?C++ SiconosMatrix::isPLUFactorized使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SiconosMatrix
的用法示例。
在下文中一共展示了SiconosMatrix::isPLUFactorized方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: if
SimpleMatrix::SimpleMatrix(const SiconosMatrix &m): SiconosMatrix(m.getNum()), _isPLUFactorized(), _isQRFactorized(false), _isPLUInversed(false)
{
// num is set in SiconosMatrix constructor with m.getNum() ... must be changed if m is Block
unsigned int numM = m.getNum();
_isPLUFactorized= m.isPLUFactorized();
_isPLUInversed= m.isPLUInversed();
if (m.ipiv())
_ipiv.reset(new VInt(*(m.ipiv())));
if (numM == 0) // ie if m is Block, this matrix is set to a dense.
{
const BlockMatrix& mB = static_cast<const BlockMatrix&>(m);
num = 1;
// get number of blocks in a row/col of m.
mat.Dense = new DenseMat(m.size(0), m.size(1));
ConstBlocksIterator1 it;
ConstBlocksIterator2 it2;
unsigned int posRow = 0;
unsigned int posCol = 0;
for (it = mB._mat->begin1(); it != mB._mat->end1(); ++it)
{
for (it2 = it.begin(); it2 != it.end(); ++it2)
{
setBlock(posRow, posCol, **it2);
posCol += (*it2)->size(1);
}
posRow += (*it)->size(0);
posCol = 0;
}
}
else if (num == 1)
{
mat.Dense = new DenseMat(m.size(0), m.size(1));
noalias(*mat.Dense) = (*m.dense());
}
else if (num == 2)
mat.Triang = new TriangMat(*m.triang());
else if (num == 3)
mat.Sym = new SymMat(*m.sym());
else if (num == 4)
mat.Sparse = new SparseMat(*m.sparse());
else if (num == 5)
mat.Banded = new BandedMat(*m.banded());
else if (num == 6)
mat.Zero = new ZeroMat(m.size(0), m.size(1));
else // if(num == 7)
mat.Identity = new IdentityMat(m.size(0), m.size(1));
}
示例2: private_prod
// x block, y siconos
void private_prod(const SiconosMatrix& A, unsigned int startRow, const SiconosVector& x, SiconosVector& y, bool init)
{
assert(!(A.isPLUFactorized()) && "A is PLUFactorized in prod !!");
// Computes y = subA *x (or += if init = false), subA being a sub-matrix of A, between el. of index (row) startRow and startRow + sizeY
if (init) // y = subA * x , else y += subA * x
y.zero();
private_addprod(A, startRow, 0, x, y);
}
示例3: subprod
void subprod(const SiconosMatrix& A, const BlockVector& x, SiconosVector& y, const Index& coord, bool init)
{
assert(!(A.isPLUFactorized()) && "A is PLUFactorized in prod !!");
// Number of the subvector of x that handles element at position coord[4]
std::size_t firstBlockNum = x.getNumVectorAtPos(coord[4]);
// Number of the subvector of x that handles element at position coord[5]
unsigned int lastBlockNum = x.getNumVectorAtPos(coord[5]);
Index subCoord = coord;
SPC::SiconosVector tmp = x[firstBlockNum];
std::size_t subSize = tmp->size(); // Size of the sub-vector
const SP::Index xTab = x.tabIndex();
if (firstBlockNum != 0)
{
subCoord[4] -= (*xTab)[firstBlockNum - 1];
subCoord[5] = std::min(coord[5] - (*xTab)[firstBlockNum - 1], subSize);
}
else
subCoord[5] = std::min(coord[5], subSize);
if (firstBlockNum == lastBlockNum)
{
subprod(A, *tmp, y, subCoord, init);
}
else
{
unsigned int xPos = 0 ; // Position in x of the current sub-vector of x
bool firstLoop = true;
subCoord[3] = coord[2] + subCoord[5] - subCoord[4];
for (VectorOfVectors::const_iterator it = x.begin(); it != x.end(); ++it)
{
if ((*it)->getNum() == 0)
SiconosMatrixException::selfThrow("subprod(A,x,y) error: not yet implemented for x block of blocks ...");
if (xPos >= firstBlockNum && xPos <= lastBlockNum)
{
tmp = x[xPos];
if (firstLoop)
{
subprod(A, *tmp, y, subCoord, init);
firstLoop = false;
}
else
{
subCoord[2] += subCoord[5] - subCoord[4]; // !! old values for 4 and 5
subSize = tmp->size();
subCoord[4] = 0;
subCoord[5] = std::min(coord[5] - (*xTab)[xPos - 1], subSize);
subCoord[3] = subCoord[2] + subCoord[5] - subCoord[4];
subprod(A, *tmp, y, subCoord, false);
}
}
xPos++;
}
}
}
示例4: prod
void prod(const SiconosVector& x, const SiconosMatrix& A, BlockVector& y, bool init)
{
assert(!(A.isPLUFactorized()) && "A is PLUFactorized in prod !!");
unsigned int startRow = 0;
VectorOfVectors::const_iterator it;
// For Each subvector of y, y[i], private_prod computes y[i] = subA x, subA being a submatrix of A corresponding to y[i] position.
// private_prod takes into account the fact that x and y[i] may be block vectors.
for (it = y.begin(); it != y.end(); ++it)
{
private_prod(createSPtrConstSiconosVector(x), createSPtrConstSiconosMatrix(A), startRow, *it, init);
startRow += (*it)->size();
}
}
示例5: private_addprod
void private_addprod(const SiconosMatrix& A, unsigned int startRow, unsigned int startCol, const BlockVector& 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.");
VectorOfVectors::const_iterator it;
unsigned int startColBis = startCol;
for (it = x.begin(); it != x.end(); ++it)
{
private_addprod(A, startRow, startColBis, **it, y);
startColBis += (*it)->size();
}
}