1 #include <../../nrnconf.h>
5 #define v_elem(v, i) (*(vector_vec(v) + i))
8 #include <unsupported/Eigen/MatrixFunctions>
21 return Eigen::Map<Eigen::VectorXd>(v1->
data(), v1->
size());
38 hoc_execerror(
"Matrix method not implemented for this type matrix",
nullptr);
42 std::vector<std::pair<int, int>> nzs;
43 for (
int i = 0;
i <
nrow();
i++) {
44 for (
int j = 0;
j <
ncol();
j++) {
46 nzs.emplace_back(
i,
j);
82 auto v = Eigen::MatrixXd::Zero(
i,
j);
83 m_.conservativeResizeLike(
v);
109 out->
full()->
m_.block(i1, j1, n0, m0) =
m_.block(i0, j0, n0, m0);
114 m_.transposeInPlace();
123 Eigen::EigenSolver<Eigen::MatrixXd> es(
m_);
124 v1 = es.eigenvalues().real();
125 mout->
full()->
m_ = es.eigenvectors().real();
130 Eigen::JacobiSVD<Eigen::MatrixXd> svd(
m_, Eigen::ComputeFullU | Eigen::ComputeFullV);
131 v1 = svd.singularValues();
133 u->
full()->
m_ = svd.matrixU().transpose();
136 v->full()->m_ = svd.matrixV().transpose();
151 auto vout =
m_.diagonal(
k);
165 m_.block(
k, 0, 1, v1.size()) = v1.transpose();
170 m_.block(0,
k, v1.size(), 1) = v1;
174 auto out =
m_.diagonal(
k);
184 m_.diagonal(
k) = out;
196 m_.diagonal(
k).fill(in);
220 if (!
lu_ || !use_lu ||
lu_->rows() !=
m_.rows()) {
221 lu_ = std::make_unique<Eigen::FullPivLU<decltype(
m_)>>(
m_);
230 double m =
m_.determinant();
232 while (std::abs(m) >= 10.0) {
236 while (std::abs(m) < 1.0) {
251 return m_.coeffRef(
i,
j);
255 for (
int k = 0;
k <
m_.outerSize(); ++
k) {
256 for (decltype(
m_)::InnerIterator it(
m_,
k); it; ++it) {
263 return m_.coeff(
i,
j);
281 if (!
lu_ || !use_lu ||
lu_->rows() !=
m_.rows()) {
283 lu_ = std::make_unique<Eigen::SparseLU<decltype(
m_)>>(
m_);
292 for (
int i = 0;
i < col; ++
i) {
299 for (
int i = 0;
i <
row; ++
i) {
308 for (
int i = 0,
j =
k;
i <
row &&
j < col; ++
i, ++
j) {
312 for (
int i = -
k,
j = 0;
i <
row &&
j < col; ++
i, ++
j) {
320 for (
int i = 0;
i < col; ++
i) {
321 m_.coeffRef(
k,
i) = in;
327 for (
int i = 0;
i <
row; ++
i) {
328 m_.coeffRef(
i,
k) = in;
340 for (
int i = 0,
j =
k;
i <
row &&
j < col; ++
i, ++
j) {
341 m_.coeffRef(
i,
j) = in;
344 for (
int i = -
k,
j = 0;
i <
row &&
j < col; ++
i, ++
j) {
345 m_.coeffRef(
i,
j) = in;
352 for (decltype(
m_)::InnerIterator it(
m_,
i); it; ++it) {
360 for (decltype(
m_)::InnerIterator it(
m_,
i); it; ++it) {
371 std::vector<std::pair<int, int>> nzs;
372 nzs.reserve(
m_.nonZeros());
373 for (
int k = 0;
k <
m_.outerSize(); ++
k) {
374 for (decltype(
m_)::InnerIterator it(
m_,
k); it; ++it) {
375 nzs.emplace_back(it.row(), it.col());
double const * data() const
double getval(int i, int j) const override
void exp(Matrix *out) const override
void mulm(Matrix *in, Matrix *out) const override
void solv(Vect *vin, Vect *vout, bool use_lu) override
int nrow() const override
void getcol(int, Vect *out) const override
double & coeff(int, int) override
void inverse(Matrix *out) const override
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > m_
void setrow(int, Vect *in) override
void pow(int, Matrix *out) const override
void bcopy(Matrix *mout, int i0, int j0, int n0, int m0, int i1, int j1) const override
int ncol() const override
void mulv(Vect *in, Vect *out) const override
std::unique_ptr< Eigen::FullPivLU< decltype(m_)> > lu_
void resize(int, int) override
void transpose(Matrix *out) override
void symmeigen(Matrix *mout, Vect *vout) const override
void add(Matrix *, Matrix *out) const override
double det(int *exponent) const override
void getrow(int, Vect *out) const override
void setcol(int, Vect *in) override
void muls(double, Matrix *out) const override
void getdiag(int, Vect *out) const override
void setdiag(int, Vect *in) override
void copy(Matrix *out) const override
void svd1(Matrix *u, Matrix *v, Vect *d) const override
static OcMatrix * instance(int nrow, int ncol, int type=MFULL)
virtual std::vector< std::pair< int, int > > nonzeros() const
virtual double getval(int i, int j) const
int sprowlen(int) const override
std::vector< std::pair< int, int > > nonzeros() const override
int nrow() const override
Eigen::SparseMatrix< double, Eigen::RowMajor > m_
void mulv(Vect *in, Vect *out) const override
double spgetrowval(int i, int jindx, int *j) const override
double getval(int, int) const override
void setdiag(int, Vect *in) override
int ncol() const override
void setcol(int, Vect *in) override
double & coeff(int, int) override
std::unique_ptr< Eigen::SparseLU< decltype(m_)> > lu_
void setrow(int, Vect *in) override
void solv(Vect *vin, Vect *vout, bool use_lu) override
void hoc_execerror(const char *s1, const char *s2)
HOC interpreter function declarations (included by hocdec.h)
static Eigen::Map< Eigen::VectorXd > Vect2VEC(Vect *v1)
int nrn_matrix_dim(void *vm, int d)