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

◆ operator+()

Matrix * Matrix::operator+ ( const Matrix & m) const

Definition at line 389 of file matrix.cpp.

390{
391 auto R = get_ring();
392 if (R != m.get_ring())
393 {
394 ERROR("matrices have different base rings");
395 return nullptr;
396 }
397 if (rows()->rank() != m.rows()->rank() || cols()->rank() != m.cols()->rank())
398 {
399 ERROR("matrices have different shapes");
400 return nullptr;
401 }
402
403 const FreeModule *F = rows();
404 const FreeModule *G = cols();
405 const_monomial deg;
406
407 if (!rows()->is_equal(m.rows())) F = R->make_FreeModule(n_rows());
408
409 if (!cols()->is_equal(m.cols())) G = R->make_FreeModule(n_cols());
410
411 auto D = R->degree_monoid();
412 if (EQ == D->compare(degree_shift(), m.degree_shift()))
413 deg = degree_shift();
414 else
415 deg = D->make_one();
416
417 MatrixConstructor mat(F, G, deg);
418 for (int i = 0; i < n_cols(); i++)
419 {
420 vec v = R->copy_vec(elem(i));
421 vec w = R->copy_vec(m[i]);
422 R->add_vec_to(v, w);
423 mat.set_column(i, v);
424 }
425 return mat.to_matrix();
426}
int rank() const
Definition freemod.hpp:105
friend class FreeModule
Definition matrix.hpp:73
const_monomial degree_shift() const
Definition matrix.hpp:149
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
friend class MatrixConstructor
Definition matrix.hpp:76
int n_cols() const
Definition matrix.hpp:147
int n_rows() const
Definition matrix.hpp:146
const FreeModule * rows() const
Definition matrix.hpp:144
const FreeModule * cols() const
Definition matrix.hpp:145
bool is_equal(const Matrix &m) const
Definition matrix.cpp:312
const int * const_monomial
Definition imonorder.hpp:45
const int ERROR
Definition m2-mem.cpp:55
size_t rank(const DMatZZpFFPACK &A)
Definition dmat.cpp:80
tbb::flow::graph G
const int EQ
Definition style.hpp:40

References cols(), degree_shift(), elem(), EQ, ERROR, FreeModule, G, get_ring(), is_equal(), Matrix(), MatrixConstructor, n_cols(), n_rows(), operator+(), FreeModule::rank(), rows(), MatrixConstructor::set_column(), and MatrixConstructor::to_matrix().

Referenced by operator+().