void subtractMultipleTo(DMat<RT>& C, const DMat<RT>& A, const DMat<RT>& B) // C = C - A*B { typedef typename RT::ElementType ElementType; typedef typename DMat<RT>::ConstIterator ConstIterator; M2_ASSERT(A.numColumns() == B.numRows()); M2_ASSERT(A.numRows() == C.numRows()); M2_ASSERT(B.numColumns() == C.numColumns()); ElementType* result = C.array(); ElementType tmp; A.ring().init(tmp); // WARNING: this routine expects the result matrix to be in ROW MAJOR ORDER for (size_t i = 0; i<A.numRows(); i++) for (size_t j = 0; j<B.numColumns(); j++) { ConstIterator i1 = A.rowBegin(i); ConstIterator iend = A.rowEnd(i); ConstIterator j1 = B.columnBegin(j); while (i1 != iend) { A.ring().mult(tmp, *i1, *j1); A.ring().subtract(*result, *result, tmp); ++i1; ++j1; } result++; } A.ring().clear(tmp); }
void mult(const DMat<RT>& A, const DMat<RT>& B, DMat<RT>& result_product) { //printf("entering dmat mult\n"); typedef typename RT::ElementType ElementType; typedef typename DMat<RT>::ConstIterator ConstIterator; M2_ASSERT(A.numColumns() == B.numRows()); M2_ASSERT(A.numRows() == result_product.numRows()); M2_ASSERT(B.numColumns() == result_product.numColumns()); ElementType* result = result_product.array(); ElementType tmp; A.ring().init(tmp); // WARNING: this routine expects the result matrix to be in ROW MAJOR ORDER for (size_t i = 0; i<A.numRows(); i++) for (size_t j = 0; j<B.numColumns(); j++) { ConstIterator i1 = A.rowBegin(i); ConstIterator iend = A.rowEnd(i); ConstIterator j1 = B.columnBegin(j); while (i1 != iend) { A.ring().mult(tmp, *i1, *j1); A.ring().add(*result, *result, tmp); ++i1; ++j1; } result++; } A.ring().clear(tmp); }
void transpose(const DMat<RT>& A, DMat<RT>& result) { assert(&A != &result); // these cannot be aliased! assert(result.numRows() == A.numColumns()); assert(result.numColumns() == A.numRows()); for (size_t c = 0; c < A.numColumns(); ++c) { auto i = A.columnBegin(c); auto j = result.rowBegin(c); auto end = A.columnEnd(c); for (; i != end; ++i, ++j) A.ring().set(*j, *i); } }