template <class F> inline void setvalue(NumTns<F>& T, F val) { for(int i=0; i<T.m(); i++) for(int j=0; j<T.n(); j++) for(int k=0; k<T.p(); k++) T(i,j,k) = val; }
template <class F> inline void setvalue(NumTns<F>& M, F val) { for(int i=0; i<M.m(); i++) for(int j=0; j<M.n(); j++) for(int k=0; k<M.p(); k++) M(i,j,k) = val; return; }
template <class T> inline void cpp2mex(const NumTns<T>& cd, mxArray*& md) { int m = cd.m(); int n = cd.n(); int p = cd.p(); int dims[3]; dims[0] = m; dims[1] = n; dims[2] = p; md = mxCreateCellArray(3,dims); int cnt = 0; for(int k=0; k<p; k++) for(int j=0; j<n; j++) for(int i=0; i<m; i++) { mxArray* ss; cpp2mex(cd(i,j,k), ss); mxSetCell(md, cnt, ss); cnt++; } return; }
//----------------------numtns<...> template <class T> inline void mex2cpp(const mxArray*& md, NumTns<T>& cd) { const int* dims = mxGetDimensions(md); int m = dims[0]; int n = dims[1]; int p = dims[2]; cd.resize(m,n,p); int cnt = 0; for(int k=0; k<p; k++) for(int j=0; j<n; j++) for(int i=0; i<m; i++) { const mxArray* tt = mxGetCell(md, cnt); mex2cpp(tt, cd(i,j,k)); cnt++; } return; }
template <class F> inline double energy(NumTns<F>& T) { double sum = 0; for(int i=0; i<T.m(); i++) for(int j=0; j<T.n(); j++) for(int k=0; k<T.p(); k++) sum += abs(T(i,j,k)*T(i,j,k)); return sum; }
template <class F> inline void clear(NumTns<F>& T) { memset(T.data(), 0, T.m()*T.n()*T.p()*sizeof(F)); }