Commit de22808a authored by Davis King's avatar Davis King

Added some assignment overloads that loop over matrices in either row-major or

column-major order depending on the layout of the given matrix.

--HG--
extra : convert_revision : svn%3Afdd8eb12-d10e-0410-9acb-85c331704f74/trunk%402776
parent 887f979b
...@@ -326,8 +326,7 @@ namespace dlib ...@@ -326,8 +326,7 @@ namespace dlib
mem_manager::type can be set to anything. mem_manager::type can be set to anything.
REQUIREMENTS ON layout REQUIREMENTS ON layout
must be one of the layout objects defined in matrix/matrix_data_layout_abstract.h or an Must be either row_major_layout or column_major_layout
object with a compatible interface.
INITIAL VALUE INITIAL VALUE
- if (num_rows > 0) then - if (num_rows > 0) then
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#define DLIB_MATRIx_ASSIGn_FWD_ #define DLIB_MATRIx_ASSIGn_FWD_
#include "../enable_if.h" #include "../enable_if.h"
#include "matrix_data_layout.h"
namespace dlib namespace dlib
{ {
...@@ -40,7 +41,8 @@ namespace dlib ...@@ -40,7 +41,8 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template <typename EXP1, typename EXP2> template <typename EXP1, typename EXP2>
inline static void matrix_assign_default ( inline typename enable_if<is_same_type<typename EXP1::layout_type, row_major_layout> >::type
matrix_assign_default (
EXP1& dest, EXP1& dest,
const EXP2& src const EXP2& src
) )
...@@ -65,7 +67,34 @@ namespace dlib ...@@ -65,7 +67,34 @@ namespace dlib
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template <typename EXP1, typename EXP2> template <typename EXP1, typename EXP2>
inline static void matrix_assign_default ( inline typename enable_if<is_same_type<typename EXP1::layout_type, column_major_layout> >::type
matrix_assign_default (
EXP1& dest,
const EXP2& src
)
/*!
requires
- src.destructively_aliases(dest) == false
- dest.nr() == src.nr()
- dest.nc() == src.nc()
ensures
- #dest == src
!*/
{
for (long c = 0; c < src.nc(); ++c)
{
for (long r = 0; r < src.nr(); ++r)
{
dest(r,c) = src(r,c);
}
}
}
// ----------------------------------------------------------------------------------------
template <typename EXP1, typename EXP2>
inline typename enable_if<is_same_type<typename EXP1::layout_type, row_major_layout> >::type
matrix_assign_default (
EXP1& dest, EXP1& dest,
const EXP2& src, const EXP2& src,
typename EXP2::type alpha, typename EXP2::type alpha,
...@@ -141,6 +170,86 @@ namespace dlib ...@@ -141,6 +170,86 @@ namespace dlib
} }
} }
// ----------------------------------------------------------------------------------------
template <typename EXP1, typename EXP2>
inline typename enable_if<is_same_type<typename EXP1::layout_type, column_major_layout> >::type
matrix_assign_default (
EXP1& dest,
const EXP2& src,
typename EXP2::type alpha,
bool add_to
)
/*!
requires
- src.destructively_aliases(dest) == false
- dest.nr() == src.nr()
- dest.nc() == src.nc()
ensures
- if (add_to == false) then
- #dest == alpha*src
- else
- #dest == dest + alpha*src
!*/
{
if (add_to)
{
if (alpha == 1)
{
for (long c = 0; c < src.nc(); ++c)
{
for (long r = 0; r < src.nr(); ++r)
{
dest(r,c) += src(r,c);
}
}
}
else if (alpha == -1)
{
for (long c = 0; c < src.nc(); ++c)
{
for (long r = 0; r < src.nr(); ++r)
{
dest(r,c) -= src(r,c);
}
}
}
else
{
for (long c = 0; c < src.nc(); ++c)
{
for (long r = 0; r < src.nr(); ++r)
{
dest(r,c) += alpha*src(r,c);
}
}
}
}
else
{
if (alpha == 1)
{
for (long c = 0; c < src.nc(); ++c)
{
for (long r = 0; r < src.nr(); ++r)
{
dest(r,c) = src(r,c);
}
}
}
else
{
for (long c = 0; c < src.nc(); ++c)
{
for (long r = 0; r < src.nr(); ++r)
{
dest(r,c) = alpha*src(r,c);
}
}
}
}
}
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
template < template <
......
...@@ -482,6 +482,10 @@ namespace dlib ...@@ -482,6 +482,10 @@ namespace dlib
class assignable_sub_range_matrix class assignable_sub_range_matrix
{ {
public: public:
typedef T type;
typedef l layout_type;
typedef matrix<T,NR,NC,mm,l> matrix_type;
assignable_sub_range_matrix( assignable_sub_range_matrix(
matrix<T,NR,NC,mm,l>& m_, matrix<T,NR,NC,mm,l>& m_,
const EXPr& rows_, const EXPr& rows_,
......
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