1 #include <../../nrnconf.h>
11 #define EPS hoc_epsilon
21 extern void install_matrix_method(
const char*
name,
double (*)(...));
23 extern double* matrix_pelm(
void*,
int i,
int j);
24 extern int matrix_nrow(
void*);
25 extern int matrix_ncol(
void*);
26 extern int matrix_type(
void*);
27 extern MAT* matrix_full(
void*);
28 extern SPMAT* matrix_sparse(
void*);
41 hoc_execerror(
"wrong size for Matrix or Vector operation", 0);
68 return (
double) m->nrow();
74 return (
double) m->ncol();
81 i = (int)
chkarg(1, 0, m->nrow() - 1);
82 j = (int)
chkarg(2, 0, m->ncol() - 1);
92 i = (int)
chkarg(1, 0, m->nrow() - 1);
93 j = (int)
chkarg(2, 0, m->ncol() - 1);
94 return m->getval(
i,
j);
101 i = (int)
chkarg(1, 0, m->nrow() - 1);
102 return double(m->sprowlen(
i));
109 i = (int)
chkarg(1, 0, m->nrow() - 1);
110 jx = (int)
chkarg(2, 0, m->sprowlen(
i) - 1);
111 x = m->spgetrowval(
i, jx, &
j);
120 int i,
j, nrow = m->nrow(), ncol = m->ncol();
121 const char* f1 =
" %-8.3g";
122 const char* f2 =
"\n";
129 for (
i = 0;
i < nrow; ++
i) {
130 for (
j = 0;
j < ncol; ++
j) {
140 int i,
j, nrow = m->nrow(), ncol = m->ncol();
143 const char* f1 =
" %-8.3g";
144 const char* f2 =
"\n";
146 pr_size = ((int)
chkarg(ia, 0, 1) == 1) ?
true :
false;
157 fprintf(f,
"%d %d\n", nrow, ncol);
159 for (
i = 0;
i < nrow; ++
i) {
160 for (
j = 0;
j < ncol; ++
j) {
175 int i,
j, nrow, ncol;
177 nrow = (int)
chkarg(2, 1, 1e9);
178 ncol = (int)
chkarg(3, 1, 1e9);
183 m->resize(nrow, ncol);
184 for (
i = 0;
i < nrow; ++
i)
185 for (
j = 0;
j < ncol; ++
j) {
194 return m->temp_objvar();
208 vout =
new Vect(m->nrow());
216 vin =
new Vect(*vin);
224 vout->resize(m->nrow());
237 return vout->temp_objvar();
249 out = Matrix::instance(
n, m, Matrix::MFULL);
252 if (mat == out && mes) {
253 hoc_execerror(mes,
" matrix operation cannot be done in place");
270 return out->temp_objvar();
276 int i0, j0, m0, n0, i1, j1,
i;
277 i0 = (int)
chkarg(1, 0, m->nrow() - 1);
278 j0 = (int)
chkarg(2, 0, m->ncol() - 1);
279 m0 = (int)
chkarg(3, 1, m->nrow() - i0);
280 n0 = (int)
chkarg(4, 1, m->ncol() - j0);
282 i1 = (int)
chkarg(5, 0, 1e9);
283 j1 = (int)
chkarg(6, 0, 1e9);
291 m->bcopy(out, i0, j0, m0, n0, i1, j1);
292 return out->temp_objvar();
302 out = Matrix::instance(m->nrow(), in->ncol(), Matrix::MFULL);
304 if (in == out || m == out) {
305 hoc_execerror(
"matrix multiplication cannot be done in place", 0);
307 out->resize(m->nrow(), in->ncol());
310 return out->temp_objvar();
317 return out->temp_objvar();
323 out->resize(m->ncol(), m->nrow());
325 return out->temp_objvar();
332 out->resize(m->nrow(), m->ncol());
338 vout =
new Vect(m->nrow());
339 p = vout->temp_objvar();
341 m->symmeigen(out, vout);
351 u->resize(m->nrow(), m->nrow());
352 v->resize(m->ncol(), m->ncol());
356 int dsize = m->nrow() < m->ncol() ? m->nrow() : m->ncol();
362 p = d->temp_objvar();
380 return out->temp_objvar();
385 int k = (int)
chkarg(1, 0, m->nrow() - 1);
392 vout->resize(m->ncol());
398 vout =
new Vect(m->ncol());
405 return vout->temp_objvar();
411 int k = (int)
chkarg(1, 0, m->ncol() - 1);
418 vout->resize(m->nrow());
424 vout =
new Vect(m->nrow());
431 return vout->temp_objvar();
437 int k = (int)
chkarg(1, 0, m->nrow() - 1);
449 return m->temp_objvar();
454 int k = (int)
chkarg(1, 0, m->ncol() - 1);
466 return m->temp_objvar();
471 int k = (int)
chkarg(1, -(m->nrow() - 1), m->ncol() - 1);
483 return m->temp_objvar();
488 int k = (int)
chkarg(1, -(m->nrow() - 1), m->ncol() - 1);
495 vout->resize(m->nrow());
501 vout =
new Vect(m->nrow());
508 return vout->temp_objvar();
515 return m->temp_objvar();
521 return m->temp_objvar();
528 return out->temp_objvar();
533 int k = (int)
chkarg(1, 0., 100.);
536 return out->temp_objvar();
543 return out->temp_objvar();
549 double a = m->det(&
e);
569 for (
int i = 2;
i <= 3; ++
i) {
576 use_lu = ((int) (*
getarg(
i))) ? true :
false;
584 vout =
new Vect(m->nrow());
590 vout->resize(m->ncol());
597 vin =
new Vect(*vin);
600 m->solv(vin, vout, use_lu);
611 return vout->temp_objvar();
617 int i,
j, nrow = m->nrow(), ncol = m->ncol();
619 for (
k = 0,
i = 0;
i < nrow; ++
i) {
620 for (
j = 0;
j < ncol; ++
j) {
624 return m->temp_objvar();
631 int nrow = m->nrow();
632 int ncol = m->ncol();
641 for (
j = 0;
j < ncol; ++
j)
642 for (
i = 0;
i < nrow; ++
i) {
643 ve[
k++] = m->getval(
i,
j);
652 int nrow = m->nrow();
653 int ncol = m->ncol();
658 for (
j = 0;
j < ncol; ++
j)
659 for (
i = 0;
i < nrow; ++
i) {
660 *(m->mep(
i,
j)) = ve[
k++];
662 return m->temp_objvar();
730 int i = 1,
j = 1, storage_type = Matrix::MFULL;
736 storage_type = int(
chkarg(3, 1, 3));
737 Matrix* m = Matrix::instance(
i,
j, storage_type);
760 #if WIN32 && !USEMATRIX
Symbol * hoc_table_lookup(const char *, Symlist *)
sprintf(buf, " if (secondorder) {\n" " int _i;\n" " for (_i = 0; _i < %d; ++_i) {\n" " _p[_slist%d[_i]] += dt*_p[_dlist%d[_i]];\n" " }}\n", numeqn, listnum, listnum)
double chkarg(int, double low, double high)
void hoc_execerror(const char *, const char *)
int hoc_is_object_arg(int narg)
Object ** hoc_temp_objvar(Symbol *symtemp, void *v)
void hoc_pushpx(double *d)
int hoc_is_double_arg(int narg)
Symbol * hoc_lookup(const char *)
Vect * vector_new1(int n)
double * hoc_pgetarg(int narg)
Object ** hoc_objgetarg(int)
Object ** vector_temp_objvar(Vect *v)
int vector_capacity(Vect *v)
void vector_resize(Vect *v, int n)
Vect * vector_new2(Vect *v)
double * vector_vec(Vect *v)
void vector_delete(Vect *v)
static Object ** temp_objvar(const char *name, void *v, Object **obp)
static double m_fprint(void *v)
static double m_printf(void *v)
static double m_scanf(void *v)
static void * m_cons(Object *o)
static void m_destruct(void *v)
static void steer_x(void *v)
static double m_det(void *v)
static Member_func m_members[]
static Object ** m_pow(void *v)
static Object ** m_symmeig(void *v)
static Matrix * get_out_mat(Matrix *mat, int n, int m, int i, const char *mes=NULL)
static Object ** m_getcol(void *v)
static Object ** m_setcol(void *v)
static Object ** m_mulm(void *v)
static double m_spgetrowval(void *v)
static double m_ncol(void *v)
static Object ** m_from_vector(void *v)
static Object ** m_zero(void *v)
static double m_nrow(void *v)
static Object ** m_setrow(void *v)
static Object ** m_exp(void *v)
static Object ** m_getdiag(void *v)
static double m_setval(void *v)
static Object ** m_getrow(void *v)
Object ** hoc_temp_objptr(Object *)
static Object ** m_bcopy(void *v)
static Object ** m_setdiag(void *v)
static double m_sprowlen(void *v)
static Object ** m_set(void *v)
static Object ** m_solv(void *v)
FILE * hoc_obj_file_arg(int i)
static Object ** m_to_vector(void *v)
static void check_domain(int i, int j)
static Object ** m_c(void *v)
static Object ** m_ident(void *v)
static Object ** m_mulv(void *v)
static Object ** m_svd(void *vv)
Matrix * matrix_arg(int i)
static Object ** m_transpose(void *v)
static Object ** m_resize(void *v)
static Object ** m_muls(void *v)
static Object ** m_add(void *v)
static void check_capac(int i, int j)
static Object ** m_inverse(void *v)
static double m_getval(void *v)
static Member_ret_obj_func m_retobj_members[]
int const size_t const size_t n
void * hoc_Emalloc(size_t size)
void class2oc(const char *, void *(*cons)(Object *), void(*destruct)(void *), Member_func *, int(*checkpoint)(void **), Member_ret_obj_func *, Member_ret_str_func *)
static philox4x32_key_t k
check_obj_type(o, "SectionList")
HocStruct cTemplate * ctemplate