It's actually fine to call rowm() or colm() with an empty index set.

This commit is contained in:
Davis King 2019-03-17 21:30:49 -04:00
parent ec63baa7a2
commit 3401b96936
3 changed files with 32 additions and 22 deletions

View File

@ -386,16 +386,20 @@ namespace dlib
// the rows matrix must contain integer elements
COMPILE_TIME_ASSERT(std::numeric_limits<typename EXP2::type>::is_integer);
DLIB_ASSERT(0 <= min(rows) && max(rows) < m.nr() && (rows.nr() == 1 || rows.nc() == 1),
"\tconst matrix_exp rowm(const matrix_exp& m, const matrix_exp& rows)"
<< "\n\tYou have given invalid arguments to this function"
<< "\n\tm.nr(): " << m.nr()
<< "\n\tm.nc(): " << m.nc()
<< "\n\tmin(rows): " << min(rows)
<< "\n\tmax(rows): " << max(rows)
<< "\n\trows.nr(): " << rows.nr()
<< "\n\trows.nc(): " << rows.nc()
#ifdef ENABLE_ASSERTS
if (rows.size() != 0) {
DLIB_ASSERT(0 <= min(rows) && max(rows) < m.nr() && (rows.nr() == 1 || rows.nc() == 1),
"\tconst matrix_exp rowm(const matrix_exp& m, const matrix_exp& rows)"
<< "\n\tYou have given invalid arguments to this function"
<< "\n\tm.nr(): " << m.nr()
<< "\n\tm.nc(): " << m.nc()
<< "\n\tmin(rows): " << min(rows)
<< "\n\tmax(rows): " << max(rows)
<< "\n\trows.nr(): " << rows.nr()
<< "\n\trows.nc(): " << rows.nc()
);
}
#endif // ENABLE_ASSERTS
typedef op_rowm_range<EXP1,EXP2> op;
return matrix_op<op>(op(m.ref(),rows.ref()));
@ -541,16 +545,20 @@ namespace dlib
// the rows matrix must contain integer elements
COMPILE_TIME_ASSERT(std::numeric_limits<typename EXP2::type>::is_integer);
DLIB_ASSERT(0 <= min(cols) && max(cols) < m.nc() && (cols.nr() == 1 || cols.nc() == 1),
"\tconst matrix_exp colm(const matrix_exp& m, const matrix_exp& cols)"
<< "\n\tYou have given invalid arguments to this function"
<< "\n\tm.nr(): " << m.nr()
<< "\n\tm.nc(): " << m.nc()
<< "\n\tmin(cols): " << min(cols)
<< "\n\tmax(cols): " << max(cols)
<< "\n\tcols.nr(): " << cols.nr()
<< "\n\tcols.nc(): " << cols.nc()
#ifdef ENABLE_ASSERTS
if (cols.size() != 0) {
DLIB_ASSERT(0 <= min(cols) && max(cols) < m.nc() && (cols.nr() == 1 || cols.nc() == 1),
"\tconst matrix_exp colm(const matrix_exp& m, const matrix_exp& cols)"
<< "\n\tYou have given invalid arguments to this function"
<< "\n\tm.nr(): " << m.nr()
<< "\n\tm.nc(): " << m.nc()
<< "\n\tmin(cols): " << min(cols)
<< "\n\tmax(cols): " << max(cols)
<< "\n\tcols.nr(): " << cols.nr()
<< "\n\tcols.nc(): " << cols.nc()
);
}
#endif // ENABLE_ASSERTS
typedef op_colm_range<EXP1,EXP2> op;
return matrix_op<op>(op(m.ref(),cols.ref()));

View File

@ -239,8 +239,8 @@ namespace dlib
requires
- rows contains integral elements (e.g. int, long)
- 0 <= min(rows) && max(rows) < m.nr()
- rows.nr() == 1 || rows.nc() == 1
(i.e. rows must be a vector)
- rows.nr() == 1 || rows.nc() == 1 || rows.size() == 0
(i.e. rows must be a vector, or just empty)
ensures
- returns a matrix R such that:
- R::type == the same type that was in m
@ -326,8 +326,8 @@ namespace dlib
requires
- cols contains integral elements (e.g. int, long)
- 0 <= min(cols) && max(cols) < m.nc()
- cols.nr() == 1 || cols.nc() == 1
(i.e. cols must be a vector)
- cols.nr() == 1 || cols.nc() == 1 || cols.size() == 0
(i.e. cols must be a vector, or just empty)
ensures
- returns a matrix R such that:
- R::type == the same type that was in m

View File

@ -1060,6 +1060,8 @@ namespace
DLIB_TEST(subm(m,range(1,1),range(0,2)) == rowm(m,1));
DLIB_TEST(subm(m,range(2,2),range(0,2)) == rowm(m,2));
DLIB_TEST(subm(m,range(3,3),range(0,2)) == rowm(m,3));
DLIB_TEST(rowm(m,matrix<long>()).size()==0);
DLIB_TEST(colm(m,matrix<long>()).size()==0);
DLIB_TEST(subm(m,0,0,2,2) == subm(m,range(0,1),range(0,1)));
DLIB_TEST(subm(m,1,1,2,2) == subm(m,range(1,2),range(1,2)));