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
mem_manager::type can be set to anything.
REQUIREMENTS ON layout
must be one of the layout objects defined in matrix/matrix_data_layout_abstract.h or an
object with a compatible interface.
Must be either row_major_layout or column_major_layout
INITIAL VALUE
- if (num_rows > 0) then
......
......@@ -4,6 +4,7 @@
#define DLIB_MATRIx_ASSIGn_FWD_
#include "../enable_if.h"
#include "matrix_data_layout.h"
namespace dlib
{
......@@ -40,7 +41,8 @@ namespace dlib
// ----------------------------------------------------------------------------------------
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,
const EXP2& src
)
......@@ -65,7 +67,34 @@ namespace dlib
// ----------------------------------------------------------------------------------------
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,
const EXP2& src,
typename EXP2::type alpha,
......@@ -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 <
......
......@@ -482,6 +482,10 @@ namespace dlib
class assignable_sub_range_matrix
{
public:
typedef T type;
typedef l layout_type;
typedef matrix<T,NR,NC,mm,l> matrix_type;
assignable_sub_range_matrix(
matrix<T,NR,NC,mm,l>& m_,
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