#ifndef _H_MATRIX4D #define _H_MATRIX4D #include using namespace std; typedef unsigned int uint; class M4DRange { public: uint LowBound, HighBound; M4DRange(): Placeholder_All(true) {}; M4DRange(uint low): LowBound(low), HighBound(low+1), Placeholder_All(false){}; M4DRange(uint low, uint high): LowBound(low), HighBound(high), Placeholder_All(false){}; void SetNMax(uint NumOfElements) { if (Placeholder_All) { LowBound=0; HighBound=NumOfElements; }; if (HighBound>NumOfElements) { HighBound=NumOfElements; } if (LowBound>HighBound) { LowBound=HighBound; } }; uint GetDiff() { return HighBound-LowBound; } private: bool Placeholder_All; }; class Matrix4D { private: uint DimA, DimB, DimC, DimD; vector > > > Data; public: Matrix4D(){}; Matrix4D(uint a, uint b, uint c, uint d): DimA(a), DimB(b), DimC(c), DimD(d) { Resize(); }; void GetDimensions(uint &a, uint &b, uint &c, uint &d) const { a=DimA; b=DimB; c=DimC; d=DimD; } void Resize(uint a, uint b, uint c, uint d) { DimA=a; DimB=b; DimC=c; DimD=d; Resize(); } void Resize() { Data.resize(DimA); for(uint ia=0;ia& InputData, M4DRange RangeA, M4DRange RangeB, M4DRange RangeC, M4DRange RangeD) { RangeA.SetNMax(DimA); RangeB.SetNMax(DimB); RangeC.SetNMax(DimC); RangeD.SetNMax(DimD); size_t NElements = InputData.size(); size_t count=0; for (uint a=RangeA.LowBound;a& OutputData, M4DRange RangeA, M4DRange RangeB, M4DRange RangeC, M4DRange RangeD) const { RangeA.SetNMax(DimA); RangeB.SetNMax(DimB); RangeC.SetNMax(DimC); RangeD.SetNMax(DimD); size_t NElements = RangeA.GetDiff() * RangeB.GetDiff() * RangeC.GetDiff() * RangeD.GetDiff(); OutputData.resize(NElements); size_t count=0; for (uint a=RangeA.LowBound;a