Make assignment from a mat(ptr,rows,cols) faster.

This commit is contained in:
Davis King 2023-07-13 19:57:41 -04:00
parent 8fc180545c
commit 52aaf01fb9
2 changed files with 37 additions and 0 deletions

View File

@ -448,6 +448,32 @@ namespace dlib
return matrix_op<op>(op(ptr,nr,nc,stride)); return matrix_op<op>(op(ptr,nr,nc,stride));
} }
template <
typename T,
long NR,
long NC,
typename MM,
typename L
>
typename enable_if<std::is_trivially_copyable<T>>::type matrix_assign (
matrix<T,NR,NC,MM,L>& dest,
const matrix_exp<matrix_op<op_pointer_to_mat<T>>>& src
)
/*!
An overload to catch statements of the form:
some_matrix = mat(ptr,rows,cols)
and convert them into a memcpy(), which is a faster way to do the copy.
!*/
{
// If the op_pointer_to_mat is referring to a contiguous block of memory then just memcopy
// it.
if (dest.size() != 0 && src.ref().op.stride == dest.nc()) {
std::memcpy(&dest(0, 0), src.ref().op.ptr, dest.nr() * dest.nc() * sizeof(T));
} else {
matrix_assign_default(dest, src);
}
}
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
} }

View File

@ -1420,6 +1420,17 @@ namespace
DLIB_TEST(mm(3) == 4); DLIB_TEST(mm(3) == 4);
} }
{
const long n = 5;
matrix<double> 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; const long n = 5;
matrix<double> m1, m2, m3, truth; matrix<double> m1, m2, m3, truth;