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)); } } } } }