private static NdArray Sum(NdArray a, int axis) { int[] resultShape = new int[a.Shape.Length - 1]; for (int i = 0, j = 0; i < a.Shape.Length; i++) { if (i != axis) { resultShape[j++] = a.Shape[i]; } } NdArray result = new NdArray(resultShape, a.BatchCount); for (int i = 0; i < a.Length; i++) { List <int> index = new List <int>(a.GetDimensionsIndex(i)); index.RemoveAt(axis); int localIndex = result.GetLocalIndex(0, index.ToArray()); for (int batchCount = 0; batchCount < a.BatchCount; batchCount++) { result.Data[batchCount * result.Length + localIndex] += a.Data[batchCount * a.Length + i]; result.Grad[batchCount * result.Length + localIndex] += a.Grad[batchCount * a.Length + i]; } } return(result); }
public static NdArray Concatenate(NdArray a, NdArray b, int axis) { int[] shapeList = a.Shape.ToArray(); shapeList[axis] += b.Shape[axis]; #if DEBUG for (int i = 0; i < a.Shape.Length; i++) { if (i != axis && a.Shape[i] != b.Shape[i]) { throw new Exception("The size of the array is not matched"); } } if (a.BatchCount != b.BatchCount) { throw new Exception("Batch size is not matched"); } #endif NdArray result = new NdArray(shapeList.ToArray(), a.BatchCount); for (int batchCount = 0; batchCount < a.BatchCount; batchCount++) { int aInputBatchoffset = batchCount * a.Length; int bInputBatchoffset = batchCount * b.Length; for (int i = 0; i < a.Length; i++) { int resultindex = result.GetLocalIndex(batchCount, a.GetDimensionsIndex(i)); result.Data[resultindex] = a.Data[i + aInputBatchoffset]; result.Grad[resultindex] = a.Grad[i + aInputBatchoffset]; } for (int i = 0; i < b.Length; i++) { int[] tmpIndex = b.GetDimensionsIndex(i); tmpIndex[axis] += a.Shape[axis]; int resultIndex = result.GetLocalIndex(batchCount, tmpIndex); result.Data[resultIndex] = b.Data[i + bInputBatchoffset]; result.Grad[resultIndex] = b.Grad[i + bInputBatchoffset]; } } return(result); }