// Copyright (C) 2010 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #include <dlib/matrix.h> #include <sstream> #include <string> #include <cstdlib> #include <ctime> #include <vector> #include "../stl_checked.h" #include "../array.h" #include "../rand.h" #include "tester.h" #include <dlib/memory_manager_stateless.h> #include <dlib/array2d.h> namespace { using namespace test; using namespace dlib; using namespace std; logger dlog("test.matrix4"); void matrix_test ( ) /*! ensures - runs tests on the matrix stuff compliance with the specs !*/ { typedef memory_manager_stateless<char>::kernel_2_2a MM; print_spinner(); { matrix<double,3,3> m = round(10*randm(3,3)); matrix<double,3,1> v = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double,3,3> m = round(10*randm(3,3)); matrix<double,1,3> v = round(10*randm(1,3)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double> m = round(10*randm(3,3)); matrix<double,1,3> v = round(10*randm(1,3)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double> m = round(10*randm(3,3)); matrix<double,0,3> v = round(10*randm(1,3)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double> m = round(10*randm(3,3)); matrix<double,1,0> v = round(10*randm(1,3)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double> m = round(10*randm(3,3)); matrix<double,3,0> v = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double> m = round(10*randm(3,3)); matrix<double,0,1> v = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double,3,3> m = round(10*randm(3,3)); matrix<double,3,0> v = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double,3,3> m = round(10*randm(3,3)); matrix<double,0,1> v = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( scale_columns(m,v) , m*tmp(diagm(v)) )); DLIB_TEST(equal( diagm(v)*m , tmp(diagm(v))*m )); DLIB_TEST(equal( scale_rows(m,v) , tmp(diagm(v))*m )); } { matrix<double,3,5> m = round(10*randm(3,5)); matrix<double,0,1> v1 = round(10*randm(5,1)); matrix<double,0,1> v2 = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v1) , m*tmp(diagm(v1)) )); DLIB_TEST(equal( scale_columns(m,v1) , m*tmp(diagm(v1)) )); DLIB_TEST(equal( diagm(v2)*m , tmp(diagm(v2))*m )); DLIB_TEST(equal( scale_rows(m,v2) , tmp(diagm(v2))*m )); } { matrix<double,3,5> m = round(10*randm(3,5)); matrix<double,5,1> v1 = round(10*randm(5,1)); matrix<double,3,1> v2 = round(10*randm(3,1)); DLIB_TEST(equal( m*diagm(v1) , m*tmp(diagm(v1)) )); DLIB_TEST(equal( scale_columns(m,v1) , m*tmp(diagm(v1)) )); DLIB_TEST(equal( diagm(v2)*m , tmp(diagm(v2))*m )); DLIB_TEST(equal( scale_rows(m,v2) , tmp(diagm(v2))*m )); } } void test_stuff() { print_spinner(); { matrix<double> m(3,3), lr(3,3), ud(3,3); m = 1,2,3, 4,5,6, 7,8,9; lr = 3,2,1, 6,5,4, 9,8,7; ud = 7,8,9, 4,5,6, 1,2,3; DLIB_TEST(lr == fliplr(m)); DLIB_TEST(ud == flipud(m)); } { matrix<double> m(3,2), lr(3,2), ud(3,2); m = 1,2, 3,4, 5,6; lr = 2,1, 4,3, 6,5; ud = 5,6, 3,4, 1,2; DLIB_TEST(lr == fliplr(m)); DLIB_TEST(ud == flipud(m)); } { matrix<int> a, b; a = matrix_cast<int>(round(10*randm(3,3))); b = a; b *= b; DLIB_TEST(b == a*a); } { matrix<double> m(2,3), m2(2,3); m = 1,2,3, 4,5,6; m2 = 3,4,5, 6,7,8; DLIB_TEST(m + 2 == m2); DLIB_TEST(2 + m == m2); m += 2; DLIB_TEST(m == m2); m -= 2; m2 = 0,1,2, 3,4,5; DLIB_TEST(m - 1 == m2); m -= 1; DLIB_TEST(m == m2); m += 1; m2 = 5,4,3, 2,1,0; DLIB_TEST(6 - m == m2); } { matrix<float> m(2,3), m2(2,3); m = 1,2,3, 4,5,6; m2 = 3,4,5, 6,7,8; DLIB_TEST(m + 2 == m2); DLIB_TEST(2 + m == m2); m += 2; DLIB_TEST(m == m2); m -= 2; m2 = 0,1,2, 3,4,5; DLIB_TEST(m - 1 == m2); m -= 1; DLIB_TEST(m == m2); m += 1; m2 = 5,4,3, 2,1,0; DLIB_TEST(6 - m == m2); } { matrix<int> m(2,3), m2(2,3); m = 1,2,3, 4,5,6; m2 = 3,4,5, 6,7,8; DLIB_TEST(m + 2 == m2); DLIB_TEST(2 + m == m2); m += 2; DLIB_TEST(m == m2); m -= 2; m2 = 0,1,2, 3,4,5; DLIB_TEST(m - 1 == m2); m -= 1; DLIB_TEST(m == m2); m += 1; m2 = 5,4,3, 2,1,0; DLIB_TEST(6 - m == m2); } { matrix<int,2,3> m, m2; m = 1,2,3, 4,5,6; m2 = 3,4,5, 6,7,8; DLIB_TEST(m + 2 == m2); DLIB_TEST(2 + m == m2); m += 2; DLIB_TEST(m == m2); m -= 2; m2 = 0,1,2, 3,4,5; DLIB_TEST(m - 1 == m2); m -= 1; DLIB_TEST(m == m2); m += 1; m2 = 5,4,3, 2,1,0; DLIB_TEST(6 - m == m2); } { matrix<double> m(2,3), m2(3,2); m = 1,2,3, 4,5,6; m2 = 2,5, 3,6, 4,7; DLIB_TEST(trans(m+1) == m2); DLIB_TEST(trans(m)+1 == m2); DLIB_TEST(1+trans(m) == m2); DLIB_TEST(1+m-1 == m); m = trans(m+1); DLIB_TEST(m == m2); m = trans(m-1); DLIB_TEST(trans(m+1) == m2); m = trans(m)+1; DLIB_TEST(m == m2); } { matrix<double> d(3,1), di(3,1); matrix<double> m(3,3); m = 1,2,3, 4,5,6, 7,8,9; d = 1,2,3; di = 1, 1/2.0, 1/3.0; DLIB_TEST(inv(diagm(d)) == diagm(di)); DLIB_TEST(pinv(diagm(d)) == diagm(di)); DLIB_TEST(inv(diagm(d))*m == tmp(diagm(di))*m); DLIB_TEST(m*inv(diagm(d)) == m*tmp(diagm(di))); DLIB_TEST(equal(inv(diagm(d)) + m , tmp(diagm(di)) + m)); DLIB_TEST(equal(m + inv(diagm(d)) , tmp(diagm(di)) + m)); DLIB_TEST((m + identity_matrix<double>(3) == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>() == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((m + 2*identity_matrix<double>(3) == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + 2*identity_matrix<double,3>() == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((m + identity_matrix<double>(3)*2 == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>()*2 == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((identity_matrix<double>(3) + m == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((identity_matrix<double,3>() + m == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((2*identity_matrix<double>(3) + m == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((2*identity_matrix<double,3>() + m == m + 2*tmp(identity_matrix<double,3>()))); } { matrix<double,3,1> d(3,1), di(3,1); matrix<double,3,3> m(3,3); m = 1,2,3, 4,5,6, 7,8,9; d = 1,2,3; di = 1, 1/2.0, 1/3.0; DLIB_TEST(equal(inv(diagm(d)) , diagm(di))); DLIB_TEST(equal(inv(diagm(d)) , diagm(di))); DLIB_TEST(equal(inv(diagm(d))*m , tmp(diagm(di))*m)); DLIB_TEST(equal(m*inv(diagm(d)) , m*tmp(diagm(di)))); DLIB_TEST_MSG(equal(inv(diagm(d)) + m , tmp(diagm(di)) + m), (inv(diagm(d)) + m) - (tmp(diagm(di)) + m) ); DLIB_TEST(equal(m + inv(diagm(d)) , tmp(diagm(di)) + m)); DLIB_TEST((m + identity_matrix<double>(3) == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>() == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((m + 2*identity_matrix<double>(3) == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + 2*identity_matrix<double,3>() == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((m + identity_matrix<double>(3)*2 == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>()*2 == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((identity_matrix<double>(3) + m == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((identity_matrix<double,3>() + m == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((2*identity_matrix<double>(3) + m == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((2*identity_matrix<double,3>() + m == m + 2*tmp(identity_matrix<double,3>()))); } { matrix<double,1,3> d(1,3), di(1,3); matrix<double,3,3> m(3,3); m = 1,2,3, 4,5,6, 7,8,9; d = 1,2,3; di = 1, 1/2.0, 1/3.0; DLIB_TEST(inv(diagm(d)) == diagm(di)); DLIB_TEST(inv(diagm(d)) == diagm(di)); DLIB_TEST(inv(diagm(d))*m == tmp(diagm(di))*m); DLIB_TEST(m*inv(diagm(d)) == m*tmp(diagm(di))); DLIB_TEST(equal(inv(diagm(d)) + m , tmp(diagm(di)) + m)); DLIB_TEST(equal(m + inv(diagm(d)) , tmp(diagm(di)) + m)); DLIB_TEST((m + identity_matrix<double>(3) == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>() == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((m + 2*identity_matrix<double>(3) == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + 2*identity_matrix<double,3>() == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((m + identity_matrix<double>(3)*2 == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>()*2 == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((identity_matrix<double>(3) + m == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((identity_matrix<double,3>() + m == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((2*identity_matrix<double>(3) + m == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((2*identity_matrix<double,3>() + m == m + 2*tmp(identity_matrix<double,3>()))); } { matrix<double,1,0> d(1,3), di(1,3); matrix<double,0,3> m(3,3); m = 1,2,3, 4,5,6, 7,8,9; d = 1,2,3; di = 1, 1/2.0, 1/3.0; DLIB_TEST(equal(inv(diagm(d)) , diagm(di))); DLIB_TEST(equal(inv(diagm(d)) , diagm(di))); DLIB_TEST(equal(inv(diagm(d))*m , tmp(diagm(di))*m)); DLIB_TEST(equal(m*inv(diagm(d)) , m*tmp(diagm(di)))); DLIB_TEST(equal(inv(diagm(d)) + m , tmp(diagm(di)) + m)); DLIB_TEST(equal(m + inv(diagm(d)) , tmp(diagm(di)) + m)); DLIB_TEST((m + identity_matrix<double>(3) == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>() == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((m + 2*identity_matrix<double>(3) == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + 2*identity_matrix<double,3>() == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((m + identity_matrix<double>(3)*2 == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((m + identity_matrix<double,3>()*2 == m + 2*tmp(identity_matrix<double,3>()))); DLIB_TEST((identity_matrix<double>(3) + m == m + tmp(identity_matrix<double>(3)))); DLIB_TEST((identity_matrix<double,3>() + m == m + tmp(identity_matrix<double,3>()))); DLIB_TEST((2*identity_matrix<double>(3) + m == m + 2*tmp(identity_matrix<double>(3)))); DLIB_TEST((2*identity_matrix<double,3>() + m == m + 2*tmp(identity_matrix<double,3>()))); } { matrix<double,3,1> d1, d2; d1 = 1,2,3; d2 = 2,3,4; matrix<double,3,3> ans; ans = 2, 0, 0, 0, 6, 0, 0, 0, 12; DLIB_TEST(ans == diagm(d1)*diagm(d2)); } dlib::rand::float_1a rnd; for (int i = 0; i < 1; ++i) { matrix<double> d1 = randm(4,1,rnd); matrix<double,5,1> d2 = randm(5,1,rnd); matrix<double,4,5> m = randm(4,5,rnd); DLIB_TEST_MSG(equal(pointwise_multiply(d1*trans(d2), m) , diagm(d1)*m*diagm(d2)), pointwise_multiply(d1*trans(d2), m) - diagm(d1)*m*diagm(d2) ); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , diagm(d1)*(m*diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , (diagm(d1)*m)*diagm(d2))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , inv(diagm(d1))*m*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , inv(diagm(d1))*(m*inv(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , (inv(diagm(d1))*m)*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , inv(diagm(d1))*m*(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , inv(diagm(d1))*(m*(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , (inv(diagm(d1))*m)*(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , (diagm(d1))*m*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , (diagm(d1))*(m*inv(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , ((diagm(d1))*m)*inv(diagm(d2)))); } for (int i = 0; i < 1; ++i) { matrix<double,4,1> d1 = randm(4,1,rnd); matrix<double,5,1> d2 = randm(5,1,rnd); matrix<double,4,5> m = randm(4,5,rnd); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , diagm(d1)*m*diagm(d2))); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , diagm(d1)*(m*diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , (diagm(d1)*m)*diagm(d2))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , inv(diagm(d1))*m*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , inv(diagm(d1))*(m*inv(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , (inv(diagm(d1))*m)*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , inv(diagm(d1))*m*(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , inv(diagm(d1))*(m*(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , (inv(diagm(d1))*m)*(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , (diagm(d1))*m*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , (diagm(d1))*(m*inv(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , ((diagm(d1))*m)*inv(diagm(d2)))); } for (int i = 0; i < 1; ++i) { matrix<double,4,1> d1 = randm(4,1,rnd); matrix<double,5,1> d2 = randm(5,1,rnd); matrix<double,0,0> m = randm(4,5,rnd); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , diagm(d1)*m*diagm(d2))); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , diagm(d1)*(m*diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(d1*trans(d2), m) , (diagm(d1)*m)*diagm(d2))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , inv(diagm(d1))*m*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , inv(diagm(d1))*(m*inv(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans(reciprocal(d2)), m) , (inv(diagm(d1))*m)*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , inv(diagm(d1))*m*(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , inv(diagm(d1))*(m*(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply(reciprocal(d1)*trans((d2)), m) , (inv(diagm(d1))*m)*(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , (diagm(d1))*m*inv(diagm(d2)))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , (diagm(d1))*(m*inv(diagm(d2))))); DLIB_TEST(equal(pointwise_multiply((d1)*trans(reciprocal(d2)), m) , ((diagm(d1))*m)*inv(diagm(d2)))); } } class matrix_tester : public tester { public: matrix_tester ( ) : tester ("test_matrix4", "Runs tests on the scale_rows and scale_columns functions.") {} void perform_test ( ) { test_stuff(); for (int i = 0; i < 10; ++i) matrix_test(); } } a; }