////////////////////////////////////////////////////////////////////// // difference of two matrices ////////////////////////////////////////////////////////////////////// MATRIX operator-(const MATRIX& A, const MATRIX& B) { MATRIX result(A.rows(), A.cols()); for (int y = 0; y < A.cols(); y++) for (int x = 0; x < A.rows(); x++) result(x,y) = A(x,y) - B(x,y); return result; }
////////////////////////////////////////////////////////////////////// // Scale matrix ////////////////////////////////////////////////////////////////////// MATRIX operator*(float alpha, const MATRIX& A) { MATRIX y(A.rows(), A.cols()); for (int i = 0; i < A.rows(); i++) for (int j = 0; j < A.cols(); j++) y(i,j) = A(i, j) * alpha; return y; }
////////////////////////////////////////////////////////////////////// // Vector-matrix multiply ////////////////////////////////////////////////////////////////////// VECTOR operator*(VECTOR& x, MATRIX& A) { assert(A.rows() == x.size()); VECTOR y(A.cols()); for (int i = 0; i < A.cols(); i++) for (int j = 0; j < A.rows(); j++) y[i] += A(j, i) * x(j); return y; }
////////////////////////////////////////////////////////////////////// // Matrix-vector multiply ////////////////////////////////////////////////////////////////////// VECTOR operator*(const MATRIX& A, const VECTOR& x) { VECTOR y(A.rows()); for (int i = 0; i < A.rows(); i++) for (int j = 0; j < A.cols(); j++) y(i) += x(j) * A(i, j); return y; }
void updateAb(MATRIX& Ab, int j, const Vector& a, const Vector& rd) { size_t n = Ab.cols()-1; Ab.middleCols(j+1,n-j) -= a * rd.segment(j+1, n-j).transpose(); }