TEST(MatrixManipulation, SNIPPET_matrix_manipulation_join) { //! [ex_matrix_manipulation_join] float hA[] = {1, 2, 3, 4, 5, 6}; float hB[] = {10, 20, 30, 40, 50, 60, 70, 80, 90}; array A = array(3, 2, hA); array B = array(3, 3, hB); af_print(join(1, A, B)); // 3x5 matrix // array result = join(0, A, B); // fail: dimension mismatch //! [ex_matrix_manipulation_join] array out = join(1, A, B); vector<float> h_out(out.elements()); out.host(&h_out.front()); af_print(out); ASSERT_EQ(3, out.dims(0)); ASSERT_EQ(5, out.dims(1)); unsigned fdim = out.dims(0); unsigned sdim = out.dims(1); for (unsigned i = 0; i < sdim; i++) { for (unsigned j = 0; j < fdim; j++) { if (i < 2) { ASSERT_FLOAT_EQ(hA[i * fdim + j], h_out[i * fdim + j]) << "At [" << i << ", " << j << "]"; } else { ASSERT_FLOAT_EQ(hB[(i - 2) * fdim + j], h_out[i * fdim + j]) << "At [" << i << ", " << j << "]"; } } } }
TEST(Join, JoinLargeDim) { using af::constant; using af::deviceGC; using af::span; // const int nx = 32; const int nx = 1; const int ny = 4 * 1024 * 1024; const int nw = 4 * 1024 * 1024; deviceGC(); { array in = randu(nx, ny, u8); array joined = join(0, in, in); dim4 in_dims = in.dims(); dim4 joined_dims = joined.dims(); ASSERT_EQ(2 * in_dims[0], joined_dims[0]); ASSERT_EQ(0.f, sum<float>((joined(0, span) - joined(1, span)).as(f32))); array in2 = constant(1, (dim_t)nx, (dim_t)ny, (dim_t)2, (dim_t)nw, u8); joined = join(3, in, in); in_dims = in.dims(); joined_dims = joined.dims(); ASSERT_EQ(2 * in_dims[3], joined_dims[3]); } }
TEST(JoinMany0, CPP) { array a0 = randu(10, 5); array a1 = randu(20, 5); array a2 = randu(5, 5); array output = join(0, a0, a1, a2); array gold = join(0, a0, join(0, a1, a2)); ASSERT_EQ(sum<float>(output - gold), 0); }
TEST(JoinMany1, CPP) { array a0 = randu(20, 200); array a1 = randu(20, 400); array a2 = randu(20, 10); array a3 = randu(20, 100); int dim = 1; array output = join(dim, a0, a1, a2, a3); array gold = join(dim, a0, join(dim, a1, join(dim, a2, a3))); ASSERT_EQ(sum<float>(output - gold), 0); }
///////////////////////////////// CPP //////////////////////////////////// // TEST(Join, CPP) { const unsigned resultIdx = 2; const unsigned dim = 2; vector<dim4> numDims; vector<vector<float> > in; vector<vector<float> > tests; readTests<float, float, int>(string(TEST_DIR "/join/join_big.test"), numDims, in, tests); dim4 i0dims = numDims[0]; dim4 i1dims = numDims[3]; array input0(i0dims, &(in[0].front())); array input1(i1dims, &(in[3].front())); array output = join(dim, input0, input1); dim4 goldDims = i0dims; goldDims[dim] = i0dims[dim] + i1dims[dim]; ASSERT_VEC_ARRAY_EQ(tests[resultIdx], goldDims, output); }