/// <summary> /// 垂直方向连接张量,加在下方,外层列数必须一致 /// </summary> /// <param name="down"></param> /// <param name="name"></param> /// <returns></returns> public Tensor VerticalConcat(Tensor down, string name = null) { if (this.DimensionY != down.DimensionY) { throw new Exception("要连接的张量外层维度不一致"); } //Matrix<double>[,] newStorage = new Matrix<double>[this.DimensionX + down.DimensionX, this.DimensionY]; //for (int i = 0; i <= this.DimensionX - 1; i++) //{ // for (int j = 0; j <= this.DimensionY - 1; j++) // { // newStorage[i, j] = this.Storage[i, j]; // } //} //for (int i = 0; i <= down.DimensionX - 1; i++) //{ // for (int j = 0; j <= this.DimensionY - 1; j++) // { // newStorage[i + this.DimensionX, j] = down.Storage[i, j]; // } //} return(TensorBuilder.FromRowMajorIEnumerable(DimensionX + down.DimensionX, DimensionY, Storage.ToRowArray().Concat(down.Storage.ToRowArray()))); //return new Tensor(newStorage, name); //var newStorage = this.Storage.ToRowArray().Concat(down.Storage.ToRowArray()); //return TensorBuilder.FromRowMajorIEnumerable(this.DimensionX + down.DimensionX, this.DimensionY, newStorage); }
/// <summary> /// 外层行切片,包括下标stop处的数据 /// </summary> /// <param name="start"></param> /// <param name="stop"></param> /// <param name="step"></param> /// <param name="name"></param> /// <returns></returns> public Tensor RowSlice(int start, int stop, int step, string name = null) { List <Matrix <double> > list = new List <Matrix <double> >(); int x = 0;//记录新张量的外层行数 for (int i = start; i <= stop; i = i + step) { for (int j = 0; j <= DimensionY - 1; j++) { list.Add(Storage[i, j]); } x++; } return(TensorBuilder.FromRowMajorIEnumerable(x, DimensionY, list, name)); }
/// <summary> /// 水平方向连接张量,加在右方,外层行数必须一致 /// </summary> /// <param name="right"></param> /// <param name="name"></param> /// <returns></returns> public Tensor HorizontalConcat(Tensor right, string name = null) { if (this.DimensionX != right.DimensionX) { throw new Exception("要连接的张量外层维度不一致"); } //Matrix<double>[,] newStorage = new Matrix<double>[this.DimensionX , this.DimensionY+right.DimensionY]; //for (int i = 0; i <= this.DimensionX - 1; i++) //{ // for (int j = 0; j <= this.DimensionY - 1; j++) // { // newStorage[i, j] = this.Storage[i, j]; // } //} //for (int i = 0; i <= this.DimensionX - 1; i++) //{ // for (int j = 0; j <= right.DimensionY- 1; j++) // { // newStorage[i , j+this.DimensionY] = right.Storage[i, j]; // } //} //return new Tensor(newStorage, name); return(TensorBuilder.FromRowMajorIEnumerable(DimensionX, DimensionY + right.DimensionY, Storage.ToRowArray().Concat(right.Storage.ToColumnArray()))); }