// Copy constructors SimpleMatrix::SimpleMatrix(const SimpleMatrix &smat): SiconosMatrix(smat.getNum()), _isPLUFactorized(false), _isQRFactorized(false), _isPLUInversed(false) { if (num == 1) { mat.Dense = new DenseMat(smat.size(0), smat.size(1)); noalias(*mat.Dense) = (*smat.dense()); } // mat.Dense = new DenseMat(*smat.dense()); else if (num == 2) mat.Triang = new TriangMat(*smat.triang()); else if (num == 3) mat.Sym = new SymMat(*smat.sym()); else if (num == 4) mat.Sparse = new SparseMat(*smat.sparse()); else if (num == 5) mat.Banded = new BandedMat(*smat.banded()); else if (num == 6) mat.Zero = new ZeroMat(smat.size(0), smat.size(1)); else// if(num == 7) mat.Identity = new IdentityMat(smat.size(0), smat.size(1)); }
void invertMatrix(const SimpleMatrix& input, SimpleMatrix& output) { InvertMatrix(*input.dense(), *output.dense()); }
// const SimpleMatrix operator + (const SimpleMatrix& A, const SimpleMatrix& B){ // return (DenseMat)(*A.dense() + *B.dense()); // } SimpleMatrix operator + (const SimpleMatrix& A, const SimpleMatrix& B) { return (DenseMat)(*A.dense() + *B.dense()); }
const SimpleMatrix matrix_pow(const SimpleMatrix& m, unsigned int power) { if (m.isBlock()) SiconosMatrixException::selfThrow("Matrix, pow function: not yet implemented for BlockMatrix."); if ( m.size(0) != m.size(1)) SiconosMatrixException::selfThrow("matrix_pow(SimpleMatrix), matrix is not square."); if (power > 0) { unsigned int num = m.num(); if (num == 1) { DenseMat p = *m.dense(); for (unsigned int i = 1; i < power; i++) p = prod(p, *m.dense()); return p; } else if (num == 2) { TriangMat t = *m.triang(); for (unsigned int i = 1; i < power; i++) t = prod(t, *m.triang()); return t; } else if (num == 3) { SymMat s = *m.sym(); for (unsigned int i = 1; i < power; i++) s = prod(s, *m.sym()); return s; } else if (num == 4) { SparseMat sp = *m.sparse(); for (unsigned int i = 1; i < power; i++) sp = prod(sp, *m.sparse()); return sp; } else if (num == 5) { DenseMat b = *m.banded(); for (unsigned int i = 1; i < power; i++) b = prod(b, *m.banded()); return b; } else if (num == 6) { ZeroMat z(m.size(0), m.size(1)); return z; } else // if (num==7) { IdentityMat I(m.size(0), m.size(1));; return I; } } else// if(power == 0) { IdentityMat I = ublas::identity_matrix<double>(m.size(0), m.size(1)); return I; } }