public Gpu4DTensor(CudaProvider provider, IReadOnlyList <FloatTensor> data) { var firstTensor = data.First(); var firstMatrix = firstTensor.Matrix.First(); _cuda = provider; _rows = firstMatrix.RowCount; _columns = firstMatrix.ColumnCount; _depth = firstTensor.Matrix.Length; _count = data.Count; var matrixSize = _rows * _columns; _data = provider.CreateMatrix(matrixSize * _depth, _count, (index, k) => { var z = index / matrixSize; var rem = index % matrixSize; var i = rem / _rows; var j = rem % _rows; return(data[k].Matrix[z].Row[j].Data[i]); }); provider.Register(this); _subVector = new Lazy <List <GpuVector[]> >(_GetSubVectors); _tensorInfo = new Lazy <TensorInput>(_GetInput); #if DEBUG if (_id == _badAlloc) { Debugger.Break(); } #endif }
public IMatrix CombineDepthSlices() { Debug.Assert(IsValid); var ret = _cuda.CreateMatrix(_rows, _columns, true); foreach (var item in Matrices) { ret.AddInPlace(item); } return(ret); }