示例#1
0
        public void TestPermute()
        {
            // Matrix transpose
            var shape     = new long[] { 45, 23 };
            var totalSize = shape.Aggregate((a, l) => a * l);
            var data      = Enumerable.Range(1, (int)totalSize).Select(i => (float)i).ToArray();

            var t1 = TensorUtils.Create(shape, data);
            var t2 = TensorUtils.Create(shape, data);

            t2 = t2.Permute(1, 0);

            for (var i = 0; i < shape[0]; ++i)
            {
                for (var j = 0; j < shape[1]; ++j)
                {
                    Assert.AreEqual(t1.GetElementAsFloat(i, j), t2.GetElementAsFloat(j, i));
                }
            }

            Assert.AreEqual(t1.Sizes[0], shape[0]);
            Assert.AreEqual(t1.Sizes[1], shape[1]);

            Assert.AreEqual(t2.Sizes[0], shape[1]);
            Assert.AreEqual(t2.Sizes[1], shape[0]);

            // ND transpose
            shape     = new long[] { 600, 28, 37, 3 };
            totalSize = shape.Aggregate((a, l) => a * l);
            data      = Enumerable.Range(1, (int)totalSize).Select(i => (float)i).ToArray();

            t1 = TensorUtils.Create(shape, data);
            t2 = t1.View(new long[] { shape[0], 1, shape[1], shape[2], shape[3] });
            t2 = t2.Permute(new int[] { 4, 3, 2, 1, 0 });

            for (var i = 0; i < shape[0]; ++i)
            {
                for (var j = 0; j < shape[1]; ++j)
                {
                    for (var k = 0; k < shape[2]; ++k)
                    {
                        for (var l = 0; l < shape[3]; ++l)
                        {
                            Assert.AreEqual(t1.GetElementAsFloat(i, j, k, l), t2.GetElementAsFloat(l, k, j, 0, i));
                        }
                    }
                }
            }
        }