Commit dbc9b4db authored by Vikas Dhiman's avatar Vikas Dhiman

support elementwise division for Matx with "/" operator.

parent 6faf00b8
...@@ -77,6 +77,7 @@ struct CV_EXPORTS Matx_AddOp {}; ...@@ -77,6 +77,7 @@ struct CV_EXPORTS Matx_AddOp {};
struct CV_EXPORTS Matx_SubOp {}; struct CV_EXPORTS Matx_SubOp {};
struct CV_EXPORTS Matx_ScaleOp {}; struct CV_EXPORTS Matx_ScaleOp {};
struct CV_EXPORTS Matx_MulOp {}; struct CV_EXPORTS Matx_MulOp {};
struct CV_EXPORTS Matx_DivOp {};
struct CV_EXPORTS Matx_MatMulOp {}; struct CV_EXPORTS Matx_MatMulOp {};
struct CV_EXPORTS Matx_TOp {}; struct CV_EXPORTS Matx_TOp {};
...@@ -174,6 +175,7 @@ public: ...@@ -174,6 +175,7 @@ public:
Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_SubOp); Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_SubOp);
template<typename _T2> Matx(const Matx<_Tp, m, n>& a, _T2 alpha, Matx_ScaleOp); template<typename _T2> Matx(const Matx<_Tp, m, n>& a, _T2 alpha, Matx_ScaleOp);
Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_MulOp); Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_MulOp);
Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_DivOp);
template<int l> Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp); template<int l> Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp);
Matx(const Matx<_Tp, n, m>& a, Matx_TOp); Matx(const Matx<_Tp, n, m>& a, Matx_TOp);
...@@ -746,6 +748,13 @@ Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_Mul ...@@ -746,6 +748,13 @@ Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_Mul
val[i] = saturate_cast<_Tp>(a.val[i] * b.val[i]); val[i] = saturate_cast<_Tp>(a.val[i] * b.val[i]);
} }
template<typename _Tp, int m, int n> inline
Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b, Matx_DivOp)
{
for( int i = 0; i < channels; i++ )
val[i] = saturate_cast<_Tp>(a.val[i] / b.val[i]);
}
template<typename _Tp, int m, int n> template<int l> inline template<typename _Tp, int m, int n> template<int l> inline
Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp) Matx<_Tp,m,n>::Matx(const Matx<_Tp, m, l>& a, const Matx<_Tp, l, n>& b, Matx_MatMulOp)
{ {
...@@ -1162,6 +1171,12 @@ Vec<_Tp, m> operator * (const Matx<_Tp, m, n>& a, const Vec<_Tp, n>& b) ...@@ -1162,6 +1171,12 @@ Vec<_Tp, m> operator * (const Matx<_Tp, m, n>& a, const Vec<_Tp, n>& b)
return (const Vec<_Tp, m>&)(c); return (const Vec<_Tp, m>&)(c);
} }
template<typename _Tp, int m, int n> static inline
Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b)
{
return Matx<_Tp, m, n>(a, b, Matx_DivOp());
}
template<typename _Tp, int m, int n> static inline template<typename _Tp, int m, int n> static inline
bool operator == (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b) bool operator == (const Matx<_Tp, m, n>& a, const Matx<_Tp, m, n>& b)
{ {
...@@ -1337,4 +1352,4 @@ template<typename _Tp> inline Vec<_Tp, 4>& operator *= (Vec<_Tp, 4>& v1, const V ...@@ -1337,4 +1352,4 @@ template<typename _Tp> inline Vec<_Tp, 4>& operator *= (Vec<_Tp, 4>& v1, const V
} // cv } // cv
#endif // __OPENCV_CORE_MATX_HPP__ #endif // __OPENCV_CORE_MATX_HPP__
\ No newline at end of file
...@@ -75,6 +75,7 @@ protected: ...@@ -75,6 +75,7 @@ protected:
bool TestSparseMat(); bool TestSparseMat();
bool TestVec(); bool TestVec();
bool TestMatxMultiplication(); bool TestMatxMultiplication();
bool TestMatxElementwiseDivison();
bool TestSubMatAccess(); bool TestSubMatAccess();
bool TestExp(); bool TestExp();
bool TestSVD(); bool TestSVD();
...@@ -891,6 +892,28 @@ bool CV_OperationsTest::TestMatxMultiplication() ...@@ -891,6 +892,28 @@ bool CV_OperationsTest::TestMatxMultiplication()
return true; return true;
} }
bool CV_OperationsTest::TestMatxElementwiseDivison()
{
try
{
Matx22f mat(2, 4, 6, 8); // Identity matrix
Matx22f mat2(2, 2, 2, 2);
Matx22f res = mat / mat2;
if(res(0, 0) != 1.0) throw test_excep();
if(res(0, 1) != 2.0) throw test_excep();
if(res(1, 0) != 3.0) throw test_excep();
if(res(1, 1) != 4.0) throw test_excep();
}
catch(const test_excep&)
{
ts->set_failed_test_info(cvtest::TS::FAIL_INVALID_OUTPUT);
return false;
}
return true;
}
bool CV_OperationsTest::TestVec() bool CV_OperationsTest::TestVec()
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment