diff --git a/lib/XYSampleData.hpp b/lib/XYSampleData.hpp index 1c5b826..fb16ae8 100644 --- a/lib/XYSampleData.hpp +++ b/lib/XYSampleData.hpp @@ -80,6 +80,9 @@ public: const DMatSample & x(const Index k); DSample & y(const Index k, const Index j); const DSample & y(const Index k, const Index j) const; + template + void setUnidimData(const DMatSample &xData, + const Ts & ...yDatas); const DMat & getXXVar(const Index i1, const Index i2); const DMat & getYYVar(const Index j1, const Index j2); const DMat & getXYVar(const Index i, const Index j); @@ -132,6 +135,25 @@ private: /****************************************************************************** * XYSampleData template implementation * ******************************************************************************/ +template +void XYSampleData::setUnidimData(const DMatSample &xData, const Ts & ...yDatas) +{ + static_assert(static_or::value...>::value, + "y data arguments are not compatible with DMatSample"); + + std::vector yData{&yDatas...}; + + FOR_STAT_ARRAY(xData, s) + FOR_VEC(xData[central], r) + { + x(r, 0)[s] = xData[s](r); + for (unsigned int j = 0; j < yData.size(); ++j) + { + y(r, j)[s] = (*(yData[j]))[s](r); + } + } +} + template SampleFitResult XYSampleData::fit(std::vector &minimizer, const DVec &init, diff --git a/lib/XYStatData.hpp b/lib/XYStatData.hpp index ae83ed3..bfb4097 100644 --- a/lib/XYStatData.hpp +++ b/lib/XYStatData.hpp @@ -79,6 +79,8 @@ public: void setXYVar(const Index i, const Index j, const DMat &m); void setXError(const Index i, const DVec &err); void setYError(const Index j, const DVec &err); + template + void setUnidimData(const DMat &xData, const Ts & ...yDatas); const DMat & getXXVar(const Index i1, const Index i2) const; const DMat & getYYVar(const Index j1, const Index j2) const; const DMat & getXYVar(const Index i, const Index j) const; @@ -135,6 +137,24 @@ private: /****************************************************************************** * XYStatData template implementation * ******************************************************************************/ +template +void XYStatData::setUnidimData(const DMat &xData, const Ts & ...yDatas) +{ + static_assert(static_or::value...>::value, + "y data arguments are not compatible with DMat"); + + std::vector yData{&yDatas...}; + + FOR_VEC(xData, r) + { + x(r, 0) = xData(r); + for (unsigned int j = 0; j < yData.size(); ++j) + { + y(r, j) = (*(yData[j]))(r); + } + } +} + template FitResult XYStatData::fit(std::vector &minimizer, const DVec &init, const DoubleModel &model, const Ts... models)