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); }