Macaulay2 Engine
Loading...
Searching...
No Matches

◆ sub_matrix() [2/2]

Matrix * Matrix::sub_matrix ( M2_arrayint r,
M2_arrayint c ) const

Definition at line 470 of file matrix.cpp.

471{
472 const FreeModule *F = rows()->sub_space(r);
473 const FreeModule *G = cols()->sub_space(c);
474 if (F == nullptr || G == nullptr) return nullptr;
475
476 int *minrow = newarray_atomic(int, n_rows());
477 int *maxrow = newarray_atomic(int, n_rows());
478 for (int i = 0; i < n_rows(); i++)
479 {
480 minrow[i] = n_rows();
481 maxrow[i] = -1;
482 }
483
484 for (int i = 0; i < r->len; i++)
485 if (r->array[i] >= 0 && r->array[i] < n_rows())
486 {
487 minrow[r->array[i]] = std::min(minrow[r->array[i]], i);
488 maxrow[r->array[i]] = std::max(maxrow[r->array[i]], i);
489 }
490
492 for (size_t j = 0; j < c->len; j++)
493 {
494 vec v = elem(c->array[j]);
495 for (; v != nullptr; v = v->next)
496 for (int i = minrow[v->comp]; i <= maxrow[v->comp]; i++)
497 if (v->comp == r->array[i])
498 mat.set_entry(i, j, v->coeff);
499 }
500 freemem(minrow);
501 freemem(maxrow);
502 return mat.to_matrix();
503}
FreeModule * sub_space(int n) const
Definition freemod.cpp:197
friend class FreeModule
Definition matrix.hpp:73
const_monomial degree_shift() const
Definition matrix.hpp:149
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
friend class MatrixConstructor
Definition matrix.hpp:76
int n_rows() const
Definition matrix.hpp:146
const FreeModule * rows() const
Definition matrix.hpp:144
const FreeModule * cols() const
Definition matrix.hpp:145
void freemem(void *s)
Definition m2-mem.cpp:103
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
tbb::flow::graph G

References cols(), degree_shift(), elem(), freemem(), FreeModule, G, Matrix(), MatrixConstructor, n_rows(), newarray_atomic, rows(), MatrixConstructor::set_entry(), sub_matrix(), and MatrixConstructor::to_matrix().

Referenced by IM2_Matrix_submatrix(), IM2_Matrix_submatrix1(), sub_matrix(), and sub_matrix().