NEURON
ocmatrix.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #include <vector>
3 #include <InterViews/resource.h>
4 
5 #define v_elem(v,i) (*(vector_vec(v) + i))
6 
7 #include "ivocvect.h"
8 #include "oc2iv.h"
9 #include <OS/math.h>
10 
11 #undef error
12 
13 extern "C" {
14 #undef OUT /* /usr/x86_64-w64-mingw32/sys-root/mingw/include/windef.h */
15 #include "matrix.h" //meschach
16 #include "matrix2.h"
17 #include "sparse.h"
18 #include "sparse2.h"
19 extern MAT *m_get(int,int);
20 } // extern "C"
21 
22 int nrn_matrix_dim(void*, int );
23 
24 #include "ocmatrix.h"
25 using std::vector;
26 
27 int nrn_matrix_dim(void* vm, int d) {
28  OcMatrix* m = (OcMatrix*)vm;
29  return d ? m->ncol(): m->nrow();
30 }
31 
32 static void Vect2VEC(Vect* v1, VEC& v2) {
33 #ifdef WIN32
34  v2.ve = vector_vec(v1);
35  v2.dim = vector_capacity(v1);
36  v2.max_dim = vector_buffer_size(v1);
37 #else
38  v2.ve = v1->data();
39  v2.dim = v1->size();
40  v2.max_dim = v1->buffer_size();
41 #endif
42 }
43 
46 
48  switch (type) {
49  default:
50  case MFULL:
51  return new OcFullMatrix(nrow, ncol);
52  case MSPARSE:
53  return new OcSparseMatrix(nrow, ncol);
54  }
55 }
56 
58  hoc_execerror("Matrix method not implemented for this type matrix", 0);
59 }
60 
61 void OcMatrix::nonzeros(vector<int>& m, vector<int>& n) {
62  m.clear();
63  n.clear();
64  for (int i = 0; i < nrow(); i++) {
65  for (int j = 0; j < ncol(); j++) {
66  if (getval(i, j)) {
67  m.push_back(i);
68  n.push_back(j);
69  }
70  }
71  }
72 }
73 
74 void OcSparseMatrix::nonzeros(vector<int>& m, vector<int>& n) {
75  m.clear();
76  n.clear();
77  for (int i = 0; i < m_->m; i++) {
78  SPROW* const r = m_->row + i;
79  row_elt* r_elt = r->elt;
80  for (int k = 0; k < r->len; k++) {
81  int j = r_elt[k].col;
82  m.push_back(i);
83  n.push_back(j);
84  }
85  }
86 }
87 
88 
90  if (type_ != MFULL) {// could clone one maybe
91  hoc_execerror("Matrix is not a FULL matrix (type 1)", 0);
92  }
93  return (OcFullMatrix*)this;
94 }
95 
97  lu_factor_ = NULL;
98  lu_pivot_ = NULL;
99  m_ = m_get(nrow, ncol);
100 }
102  if (lu_factor_) {
105  }
106  M_FREE(m_);
107 }
108 double* OcFullMatrix::mep(int i, int j) {
109  return &m_->me[i][j];
110 }
111 double OcFullMatrix::getval(int i, int j) {
112  return m_->me[i][j];
113 }
115  return m_->m;
116 }
118  return m_->n;
119 }
120 
121 void OcFullMatrix::resize(int i, int j) {
122  m_resize(m_, i, j);
123 }
124 
125 void OcFullMatrix::mulv(Vect* vin, Vect* vout) {
126  VEC v1, v2;
127  Vect2VEC(vin, v1);
128  Vect2VEC(vout, v2);
129  mv_mlt(m_, &v1, &v2);
130 }
131 
133  m_mlt(m_, in->full()->m_, out->full()->m_);
134 }
135 
136 void OcFullMatrix::muls(double s, Matrix* out) {
137  sm_mlt(s, m_, out->full()->m_);
138 }
139 
140 void OcFullMatrix::add(Matrix* in, Matrix* out) {
141  m_add(m_, in->full()->m_, out->full()->m_);
142 }
143 
145  m_copy(m_, out->full()->m_);
146 }
147 
148 void OcFullMatrix::bcopy(Matrix* out, int i0, int j0, int n0, int m0, int i1, int j1) {
149  m_move(m_, i0, j0, n0, m0, out->full()->m_, i1, j1);
150 }
151 
153  m_transp(m_, out->full()->m_);
154 }
155 
156 void OcFullMatrix::symmeigen(Matrix* mout, Vect* vout) {
157  VEC v1;
158  Vect2VEC(vout, v1);
159  symmeig(m_, mout->full()->m_, &v1);
160 }
161 
163  VEC v1;
164  Vect2VEC(d, v1);
165  svd(m_, u?u->full()->m_:NULL, v?v->full()->m_:NULL, &v1);
166 }
167 
168 void OcFullMatrix::getrow(int k, Vect* out) {
169  VEC v1;
170  Vect2VEC(out, v1);
171  get_row(m_, k, &v1);
172 }
173 
174 void OcFullMatrix::getcol(int k, Vect* out) {
175  VEC v1;
176  Vect2VEC(out, v1);
177  get_col(m_, k, &v1);
178 }
179 
180 void OcFullMatrix::getdiag(int k, Vect* out) {
181  int i, j, row, col;
182  row = nrow();
183  col = ncol();
184  if (k >= 0) {
185  for (i=0, j=k; i < row && j < col; ++i, ++j) {
186 #ifdef WIN32
187  v_elem(out, i) = m_entry(m_, i, j);
188 #else
189  out->elem(i) = m_entry(m_, i, j);
190 #endif
191  }
192  }else{
193  for (i= -k, j=0; i < row && j < col; ++i, ++j) {
194 #ifdef WIN32
195  v_elem(out, i) = m_entry(m_, i, j);
196 #else
197  out->elem(i) = m_entry(m_, i, j);
198 #endif
199  }
200  }
201 }
202 
203 void OcFullMatrix::setrow(int k, Vect* in) {
204  VEC v1;
205  Vect2VEC(in, v1);
206  set_row(m_, k, &v1);
207 }
208 
209 void OcFullMatrix::setcol(int k, Vect* in) {
210  VEC v1;
211  Vect2VEC(in, v1);
212  set_col(m_, k, &v1);
213 }
214 
215 void OcFullMatrix::setdiag(int k, Vect* in) {
216  int i, j, row, col;
217  row = nrow();
218  col = ncol();
219  if (k >= 0) {
220  for (i=0, j=k; i < row && j < col; ++i, ++j) {
221 #ifdef WIN32
222  m_set_val(m_, i, j, v_elem(in, i));
223 #else
224  m_set_val(m_, i, j, in->elem(i));
225 #endif
226  }
227  }else{
228  for (i= -k, j=0; i < row && j < col; ++i, ++j) {
229 #ifdef WIN32
230  m_set_val(m_, i, j, v_elem(in, i));
231 #else
232  m_set_val(m_, i, j, in->elem(i));
233 #endif
234  }
235  }
236 }
237 
238 void OcFullMatrix::setrow(int k, double in) {
239  int i, col = ncol();
240  for (i=0; i < col; ++i) {
241  m_set_val(m_, k, i, in);
242  }
243 }
244 
245 void OcFullMatrix::setcol(int k, double in) {
246  int i, row = nrow();
247  for (i=0; i < row; ++i) {
248  m_set_val(m_, i, k, in);
249  }
250 }
251 
252 void OcFullMatrix::setdiag(int k, double in) {
253  int i, j, row, col;
254  row = nrow();
255  col = ncol();
256  if (k >= 0) {
257  for (i=0, j=k; i < row && j < col; ++i, ++j) {
258  m_set_val(m_, i, j, in);
259  }
260  }else{
261  for (i= -k, j=0; i < row && j < col; ++i, ++j) {
262  m_set_val(m_, i, j, in);
263  }
264  }
265 }
266 
268  m_zero(m_);
269 }
270 
272  m_ident(m_);
273 }
274 
276  m_exp(m_, 0., out->full()->m_);
277 }
278 
279 void OcFullMatrix::pow(int i, Matrix* out) {
280  m_pow(m_, i, out->full()->m_);
281 }
282 
284  m_inverse(m_, out->full()->m_);
285 }
286 
287 void OcFullMatrix::solv(Vect* in, Vect* out, bool use_lu) {
288  bool call_lufac = true;
289  if (!lu_factor_) {
290  lu_factor_ = m_get(nrow(), nrow());
291  lu_pivot_ = px_get(nrow());
292  }else if (use_lu && lu_factor_->m == nrow()) {
293  call_lufac = false;
294  }
295  VEC v1, v2;
296  Vect2VEC(in, v1);
297  Vect2VEC(out, v2);
298  if (call_lufac) {
299  m_resize(lu_factor_, nrow(), nrow());
300  m_copy(m_, lu_factor_);
303  }
304  LUsolve(lu_factor_, lu_pivot_, &v1, &v2);
305 }
306 
307 double OcFullMatrix::det(int* e) {
308  int n = nrow();
309  MAT* lu = m_get(n, n);
310  PERM* piv = px_get(n);
311  m_copy(m_, lu);
312  LUfactor(lu, piv);
313 #if 0
314 printf("LU\n");
315 for (int i = 0; i < n; ++i) {
316  for (int j = 0; j < n; ++j) {
317  printf(" %g", lu->me[i][j]);
318  }
319  printf("\t%d\n", piv->pe[i]);
320 }
321 #endif
322  double m = 1.0;
323  *e = 0;
324  for (int i = 0; i < n; ++i) {
325  m *= lu->me[i][i];
326  if (m == 0.0) { break; }
327  while(Math::abs(m) >= 1e12) {
328  m *= 1e-12;
329  *e += 12;
330  }
331  while(Math::abs(m) < 1e-12) {
332  m *= 1e12;
333  *e -= 12;
334  }
335  }
336  if (m) {
337  while(Math::abs(m) >= 10.0) {
338  m *= 0.1;
339  *e += 1;
340  }
341  while(Math::abs(m) < 1.0) {
342  m *= 10.0;
343  *e -= 1;
344  }
345  }
346  m *= double(px_sign(piv));
347  M_FREE(lu);
348  PX_FREE(piv);
349  return m;
350 }
351 
352 //--------------------------
353 
355  /* sp_get -- get sparse matrix
356  -- len is number of elements available for each row without
357  allocating further memory */
358 
359  int len = 4;
360  m_ = sp_get(nrow, ncol, len);
361  lu_factor_ = NULL;
362  lu_pivot_ = NULL;
363 }
365  if (lu_factor_) {
368  }
369  SP_FREE(m_);
370 }
371 
372 // returns pointer to sparse element. NULL if it does not exist.
373 double* OcSparseMatrix::pelm(int i, int j) {
374  SPROW* r = m_->row + i;
375  int idx = sprow_idx(r, j);
376  if (idx >= 0) {
377  return &r->elt[idx].val;
378  }else{
379  return NULL;
380  }
381 }
382 
383 double* OcSparseMatrix::mep(int i, int j) {
384  SPROW* r = m_->row + i;
385  int idx = sprow_idx(r, j);
386  if (idx >= 0) {
387  return &r->elt[idx].val;
388  }
389  // does not exist so create it with a value of 0
390  sp_set_val(m_, i, j, 0.);
391  // and try again
392  idx = sprow_idx(r, j);
393  return &r->elt[idx].val;
394 }
395 
397  sp_zero(m_);
398 }
399 
400 double OcSparseMatrix::getval(int i, int j) {
401  return sp_get_val(m_, i, j);
402 }
404  return m_->m;
405 }
407  return m_->n;
408 }
409 void OcSparseMatrix::mulv(Vect* vin, Vect* vout) {
410  VEC v1, v2;
411  Vect2VEC(vin, v1);
412  Vect2VEC(vout, v2);
413  sp_mv_mlt(m_, &v1, &v2);
414 }
415 
416 void OcSparseMatrix::solv(Vect* in, Vect* out, bool use_lu) {
417  bool call_lufac = true;
418  if (!lu_factor_) {
419  lu_factor_ = sp_get(nrow(), nrow(), 4);
420  lu_pivot_ = px_get(nrow());
421  }else if (use_lu && lu_factor_->m == nrow()) {
422  call_lufac = false;
423  }
424  VEC v1, v2;
425  Vect2VEC(in, v1);
426  Vect2VEC(out, v2);
427  if (call_lufac) {
428  sp_resize(lu_factor_, nrow(), nrow());
432  }
433  spLUsolve(lu_factor_, lu_pivot_, &v1, &v2);
434 }
435 
436 void OcSparseMatrix::setrow(int k, Vect* in) {
437  VEC v1;
438  Vect2VEC(in, v1);
439  int i, n = ncol();
440  double* p;
441  for (i=0; i < n; ++i) {
442  if ((p = pelm(k, i)) != NULL) {
443 #ifdef WIN32
444  *p = v_elem(in, i);
445  }else if (v_elem(in, i)) {
446  sp_set_val(m_, k, i, v_elem(in, i));
447 #else
448  *p = in->elem(i);
449  }else if (in->elem(i)) {
450  sp_set_val(m_, k, i, in->elem(i));
451 #endif
452  }
453  }
454 }
455 
456 void OcSparseMatrix::setcol(int k, Vect* in) {
457  VEC v1;
458  Vect2VEC(in, v1);
459  int i, n = nrow();
460  double* p;
461  for (i=0; i < n; ++i) {
462  if ((p = pelm(i, k)) != NULL) {
463 #ifdef WIN32
464  *p = v_elem(in, i);
465  }else if (v_elem(in, i)) {
466  sp_set_val(m_, i, k, v_elem(in, i));
467 #else
468  *p = in->elem(i);
469  }else if (in->elem(i)) {
470  sp_set_val(m_, i, k, in->elem(i));
471 #endif
472  }
473  }
474 }
475 
477  int i, j, row, col;
478  row = nrow();
479  col = ncol();
480  double* p;
481  if (k >= 0) {
482  for (i=0, j=k; i < row && j < col; ++i, ++j) {
483  if ((p = pelm(i, j)) != NULL) {
484 #ifdef WIN32
485  *p = v_elem(in, i);
486  }else if (v_elem(in, i)) {
487  sp_set_val(m_, i, j, v_elem(in, i));
488 #else
489  *p = in->elem(i);
490  }else if (in->elem(i)) {
491  sp_set_val(m_, i, j, in->elem(i));
492 #endif
493  }
494  }
495  }else{
496  for (i= -k, j=0; i < row && j < col; ++i, ++j) {
497  if ((p = pelm(i, j)) != NULL) {
498 #ifdef WIN32
499  *p = v_elem(in, i);
500  }else if (v_elem(in, i)) {
501  sp_set_val(m_, i, j, v_elem(in, i));
502 #else
503  *p = in->elem(i);
504  }else if (in->elem(i)) {
505  sp_set_val(m_, i, j, in->elem(i));
506 #endif
507 
508  }
509  }
510  }
511 }
512 
513 void OcSparseMatrix::setrow(int k, double in) {
514  int i, col = ncol();
515  for (i=0; i < col; ++i) {
516  sp_set_val(m_, k, i, in);
517  }
518 }
519 
520 void OcSparseMatrix::setcol(int k, double in) {
521  int i, row = nrow();
522  for (i=0; i < row; ++i) {
523  sp_set_val(m_, i, k, in);
524  }
525 }
526 
528  setdiag(0, 1);
529 }
530 
531 void OcSparseMatrix::setdiag(int k, double in) {
532  int i, j, row, col;
533  row = nrow();
534  col = ncol();
535  if (k >= 0) {
536  for (i=0, j=k; i < row && j < col; ++i, ++j) {
537  sp_set_val(m_, i, j, in);
538  }
539  }else{
540  for (i= -k, j=0; i < row && j < col; ++i, ++j) {
541  sp_set_val(m_, i, j, in);
542  }
543  }
544 }
545 
547  return m_->row[i].len;
548 }
549 
550 double OcSparseMatrix::spgetrowval(int i, int jindx, int* j) {
551  *j = m_->row[i].elt[jindx].col;
552  return m_->row[i].elt[jindx].val;
553 }
554 
MAT * m_get(int, int)
Definition: memory.c:36
virtual void transpose(Matrix *out)
Definition: ocmatrix.cpp:152
Real val
Definition: sparse.h:46
virtual int nrow()
Definition: ocmatrix.cpp:403
MAT * LUfactor(MAT *A, PERM *pivot)
Definition: lufactor.c:46
virtual void getcol(int, Vect *out)
Definition: ocmatrix.cpp:174
virtual double getval(int, int)
Definition: ocmatrix.cpp:400
double sp_set_val(SPMAT *A, int i, int j, double val)
Definition: sparse.c:66
virtual void nonzeros(vector< int > &m, vector< int > &n)
Definition: ocmatrix.cpp:74
short type
Definition: cabvars.h:10
static void Vect2VEC(Vect *v1, VEC &v2)
Definition: ocmatrix.cpp:32
Object * obj_
Definition: ocmatrix.h:71
VEC * symmeig(MAT *A, MAT *Q, VEC *out)
Definition: symmeig.c:174
#define Vect
Definition: ivocvect.h:14
MAT * lu_factor_
Definition: ocmatrix.h:116
static Object ** m_inverse(void *v)
Definition: matrix.cpp:538
virtual void copy(Matrix *out)
Definition: ocmatrix.cpp:144
virtual void bcopy(Matrix *mout, int i0, int j0, int n0, int m0, int i1, int j1)
Definition: ocmatrix.cpp:148
virtual int sprowlen(int)
Definition: ocmatrix.cpp:546
virtual ~OcFullMatrix()
Definition: ocmatrix.cpp:101
virtual double det(int *exponent)
Definition: ocmatrix.cpp:307
virtual void muls(double, Matrix *out)
Definition: ocmatrix.cpp:136
SPMAT * sp_resize(SPMAT *A, int m, int n)
Definition: sparse.c:727
size_t p
virtual void add(Matrix *, Matrix *out)
Definition: ocmatrix.cpp:140
virtual void setdiag(int, Vect *in)
Definition: ocmatrix.cpp:476
VEC * svd(MAT *A, MAT *U, MAT *V, VEC *out)
Definition: svd.c:350
virtual int ncol()
Definition: ocmatrix.h:30
row_elt * elt
Definition: sparse.h:51
#define m_set_val(A, i, j, val)
Definition: matrix.h:277
virtual double * mep(int, int)
Definition: ocmatrix.cpp:383
void unimp()
Definition: ocmatrix.cpp:57
#define v
Definition: md1redef.h:4
virtual void inverse(Matrix *out)
Definition: ocmatrix.cpp:283
virtual void ident()
Definition: ocmatrix.cpp:271
MAT * sm_mlt(double scalar, MAT *matrix, MAT *out)
Definition: matop.c:241
static int abs(int)
Definition: math.cpp:43
virtual void pow(int, Matrix *out)
Definition: ocmatrix.cpp:279
static philox4x32_key_t k
Definition: nrnran123.cpp:11
#define m_copy(in, out)
Definition: matrix.h:403
virtual void mulv(Vect *in, Vect *out)
Definition: ocmatrix.cpp:409
u_int n
Definition: matrix.h:74
static Object ** m_exp(void *v)
Definition: matrix.cpp:523
#define e
Definition: passive0.cpp:24
virtual void solv(Vect *vin, Vect *vout, bool use_lu)
Definition: ocmatrix.cpp:287
VEC * spLUsolve(SPMAT *, PERM *, VEC *, VEC *)
static OcMatrix * instance(int nrow, int ncol, int type=MFULL)
Definition: ocmatrix.cpp:47
virtual void resize(int, int)
Definition: ocmatrix.cpp:121
#define M_FREE(mat)
Definition: matrix.h:213
Definition: sparse.h:44
int col
Definition: sparse.h:45
Real * ve
Definition: matrix.h:69
SPMAT * sp_zero(SPMAT *A)
Definition: sparse.c:633
Definition: matrix.h:67
virtual int ncol()
Definition: ocmatrix.cpp:406
static Object ** m_add(void *v)
Definition: matrix.cpp:261
virtual void setrow(int, Vect *in)
Definition: ocmatrix.cpp:203
virtual void symmeigen(Matrix *mout, Vect *vout)
Definition: ocmatrix.cpp:156
int const size_t const size_t n
Definition: nrngsl.h:12
virtual double * mep(int, int)
Definition: ocmatrix.cpp:108
OcFullMatrix * full()
Definition: ocmatrix.cpp:89
virtual double getval(int i, int j)
Definition: ocmatrix.h:28
int n
Definition: sparse.h:55
_CONST char * s
Definition: system.cpp:74
VEC * LUsolve(MAT *A, PERM *pivot, VEC *b, VEC *x)
Definition: lufactor.c:140
PERM * px_resize(PERM *, int)
Definition: memory.c:399
#define printf
Definition: mwprefix.h:26
virtual void setdiag(int, Vect *in)
Definition: ocmatrix.cpp:215
u_int dim
Definition: matrix.h:68
int px_sign(PERM *)
Definition: pxop.c:269
virtual double spgetrowval(int i, int jindx, int *j)
Definition: ocmatrix.cpp:550
int m
Definition: sparse.h:55
int sprow_idx(SPROW *, int)
Definition: sprow.c:75
SPMAT * lu_factor_
Definition: ocmatrix.h:150
Definition: sparse.h:49
SPMAT * sp_get(int m, int n, int maxlen)
Definition: sparse.c:198
void hoc_execerror(const char *, const char *)
Definition: hoc.cpp:741
virtual ~OcSparseMatrix()
Definition: ocmatrix.cpp:364
int type_
Definition: ocmatrix.h:73
virtual double * pelm(int, int)
Definition: ocmatrix.cpp:373
size_t j
#define m_move
Definition: matrix.h:50
#define set_col(mat, col, vec)
Definition: matrix.h:564
virtual int nrow()
Definition: ocmatrix.cpp:114
static Object ** m_pow(void *v)
Definition: matrix.cpp:530
virtual void setcol(int, Vect *in)
Definition: ocmatrix.cpp:456
virtual double getval(int i, int j)
Definition: ocmatrix.cpp:111
virtual void exp(Matrix *out)
Definition: ocmatrix.cpp:275
SPMAT * m_
Definition: ocmatrix.h:149
OcSparseMatrix(int, int)
Definition: ocmatrix.cpp:354
VEC * sp_mv_mlt(SPMAT *A, VEC *x, VEC *out)
Definition: sparse.c:123
SPMAT * spLUfactor(SPMAT *, PERM *, double)
Definition: splufctr.c:49
#define PX_FREE(px)
Definition: matrix.h:215
int len
Definition: sparse.h:50
virtual void mulm(Matrix *in, Matrix *out)
Definition: ocmatrix.cpp:132
static unsigned row
Definition: nonlin.cpp:89
virtual int ncol()
Definition: ocmatrix.cpp:117
int vector_capacity(Vect *v)
Definition: ivocvect.cpp:268
u_int max_dim
Definition: matrix.h:68
int vector_buffer_size(Vect *v)
Definition: ivocvect.cpp:267
virtual void setcol(int, Vect *in)
Definition: ocmatrix.cpp:209
PERM * lu_pivot_
Definition: ocmatrix.h:151
OcMatrix(int type)
Definition: ocmatrix.cpp:44
SPROW * row
Definition: sparse.h:57
VEC * get_row(MAT *, u_int, VEC *)
virtual void getrow(int, Vect *out)
Definition: ocmatrix.cpp:168
virtual void getdiag(int, Vect *out)
Definition: ocmatrix.cpp:180
OcFullMatrix(int, int)
Definition: ocmatrix.cpp:96
static Object ** m_resize(void *v)
Definition: matrix.cpp:190
virtual void zero()
Definition: ocmatrix.cpp:396
VEC * mv_mlt(MAT *A, VEC *b, VEC *out)
Definition: matop.c:205
PERM * px_get(int)
virtual void mulv(Vect *in, Vect *out)
Definition: ocmatrix.cpp:125
#define i
Definition: md1redef.h:12
static Object ** m_zero(void *v)
Definition: matrix.cpp:511
double * vector_vec(Vect *v)
Definition: ivocvect.cpp:271
VEC * get_col(MAT *, u_int, VEC *)
MAT * m_mlt(MAT *A, MAT *B, MAT *OUT)
Definition: matop.c:88
int nrn_matrix_dim(void *, int)
Definition: ocmatrix.cpp:27
#define set_row(mat, row, vec)
Definition: matrix.h:562
u_int m
Definition: matrix.h:74
virtual ~OcMatrix()
Definition: ocmatrix.cpp:45
MAT * m_
Definition: ocmatrix.h:115
virtual int nrow()
Definition: ocmatrix.h:29
virtual void zero()
Definition: ocmatrix.cpp:267
Definition: matrix.h:87
virtual void solv(Vect *vin, Vect *vout, bool use_lu)
Definition: ocmatrix.cpp:416
virtual void svd1(Matrix *u, Matrix *v, Vect *d)
Definition: ocmatrix.cpp:162
double sp_get_val(SPMAT *A, int i, int j)
Definition: sparse.c:45
virtual void nonzeros(vector< int > &m, vector< int > &n)
Definition: ocmatrix.cpp:61
return NULL
Definition: cabcode.cpp:461
#define v_elem(v, i)
Definition: ocmatrix.cpp:5
#define SP_FREE(A)
Definition: sparse.h:183
SPMAT * sp_copy2(SPMAT *A, SPMAT *OUT)
Definition: sparse.c:655
Real ** me
Definition: matrix.h:76
MatrixPtr Matrix
Definition: sputils.c:601
Definition: matrix.h:73
u_int * pe
Definition: matrix.h:88
static Object ** m_ident(void *v)
Definition: matrix.cpp:517
MAT * m_transp(MAT *in, MAT *out)
Definition: matop.c:300
virtual void ident(void)
Definition: ocmatrix.cpp:527
virtual void setrow(int, Vect *in)
Definition: ocmatrix.cpp:436
#define m_entry(A, i, j)
Definition: matrix.h:274
PERM * lu_pivot_
Definition: ocmatrix.h:117