Multiply with transpose sugar A'*v = A^v

release/4.3a0
Frank Dellaert 2009-12-25 17:52:58 +00:00
parent 80ff7e6d26
commit 2cb52694b5
2 changed files with 17 additions and 10 deletions

View File

@ -85,7 +85,18 @@ bool assert_equal(const Matrix& A, const Matrix& B, double tol = 1e-9);
*/ */
inline Vector operator*(const Matrix& A, const Vector & v) { inline Vector operator*(const Matrix& A, const Vector & v) {
if (A.size2()!=v.size()) throw(std::invalid_argument("Matrix operator* : A.n!=v.size")); if (A.size2()!=v.size()) throw(std::invalid_argument("Matrix operator* : A.n!=v.size"));
return Vector(prod(A,v)); return prod(A,v);
}
/**
* overload ^ for trans(A)*v
* We transpose the vectors for speed.
*/
inline Vector operator^(const Matrix& A, const Vector & v) {
if (A.size1()!=v.size()) throw(std::invalid_argument("Matrix operator^ : A.m!=v.size"));
Vector vt = trans(v);
Vector vtA = prod(vt,A);
return trans(vtA);
} }
/** /**
@ -93,7 +104,7 @@ inline Vector operator*(const Matrix& A, const Vector & v) {
*/ */
inline Vector operator*(const Vector & v, const Matrix& A) { inline Vector operator*(const Vector & v, const Matrix& A) {
if (A.size1()!=v.size()) throw(std::invalid_argument("Matrix operator* : A.m!=v.size")); if (A.size1()!=v.size()) throw(std::invalid_argument("Matrix operator* : A.m!=v.size"));
return Vector(prod(v,A)); return prod(v,A);
} }
/** /**

View File

@ -337,16 +337,12 @@ TEST( matrix, matrix_vector_multiplication )
1.0,2.0,3.0, 1.0,2.0,3.0,
4.0,5.0,6.0 4.0,5.0,6.0
); );
Vector v(3); Vector v = Vector_(3,1.,2.,3.);
v(0) = 1.0; Vector Av = Vector_(2,14.,32.);
v(1) = 2.0; Vector AtAv = Vector_(3,142.,188.,234.);
v(2) = 3.0;
Vector Av(2);
Av(0) = 14.0;
Av(1) = 32.0;
EQUALITY(A*v,Av); EQUALITY(A*v,Av);
EQUALITY(A^Av,AtAv);
} }
/* ************************************************************************* */ /* ************************************************************************* */