diff --git a/dlib/matrix/matrix_mat.h b/dlib/matrix/matrix_mat.h index 803d7d999..bb634aa86 100644 --- a/dlib/matrix/matrix_mat.h +++ b/dlib/matrix/matrix_mat.h @@ -448,6 +448,40 @@ namespace dlib return matrix_op(op(ptr,nr,nc,stride)); } + template < + typename T, + long NR, + long NC, + typename MM + > + typename enable_if>::type matrix_assign ( + matrix& dest, + const matrix_exp>>& src + ) + /*! + An overload to catch statements of the form: + some_matrix = mat(ptr,rows,cols, stride) + and convert them into a memcpy(), which is a faster way to do the copy. + !*/ + { + if (dest.size() == 0) return; + + // If the op_pointer_to_mat is referring to a contiguous block of memory then just one memcopy + // is needed. + if (src.ref().op.stride == dest.nc()) + { + std::memcpy(&dest(0, 0), src.ref().op.ptr, dest.nr() * dest.nc() * sizeof(T)); + } + else + { + // Otherwise memcpy() each row separately. + for (long r=0; r m1, m2; + m1 = randm(n,n); + m2 = randm(n,n); + + m2 = mat(&m1(0,0),n,n); + + DLIB_TEST(m1 == m2); + } + + { + const long n = 5; + matrix m1, m2; + m1 = randm(n,n); + m2 = randm(n,n); + + m2 = mat(&m1(0,0),n,n-1,n); + + DLIB_TEST(m2 == subm(m1, 0, 0, n, n-1)); + } + { const long n = 5; matrix m1, m2, m3, truth;