diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 5504d9f..d423749 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -21,11 +21,11 @@ add_example(fft_filter_ex OFF) add_example(windowfunc_ex OFF) add_example(legendre_ex OFF) add_example(refellipsoid_ex OFF) -add_example(kde_ex ON) +add_example(kde_ex OFF) add_example(meshio_ex OFF) add_example(autodiff_ex OFF) add_example(multinary_ex OFF) add_example(text_io_ex OFF) add_example(getoption_ex OFF) add_example(process_ex OFF) -add_example(array_ex OFF) \ No newline at end of file +add_example(array_ex ON) \ No newline at end of file diff --git a/example/array_ex.cpp b/example/array_ex.cpp index 6e51ab6..34c84f6 100644 --- a/example/array_ex.cpp +++ b/example/array_ex.cpp @@ -41,6 +41,9 @@ int main(int argc, char const *argv[]) try A.for_each([](double &a, size_t i){ a += 1;}); A.show(); + A.sequence(1.0, 0.5, 3, 4, 1); + A.show(); + // copy A to a new array array B = A; B.normalize(); @@ -53,6 +56,10 @@ int main(int argc, char const *argv[]) try S.normalize(); S.show(); + array P(5); + P.sequence(point3dc(0, 0, 0), point3dc(2, 1, 0.5)); + P.show(std::cout, '\n'); + // create a new 2D array matrix C(5, 5, 1); C.sequence(0, 1, 10); diff --git a/lib/algorithm/interpolate.cpp b/lib/algorithm/interpolate.cpp index 6b118cb..0888f47 100644 --- a/lib/algorithm/interpolate.cpp +++ b/lib/algorithm/interpolate.cpp @@ -129,21 +129,23 @@ double gctl::sph_linear_interpolate_deg(double CoLat1,double CoLat2,double Lon1, // 插值点坐标x y // 四个角点值 double gctl::rect_interpolate(double x0,double y0,double dx,double dy,double x,double y, - double d0,double d1,double d2,double d3) + double d0,double d1,double d2,double d3, double p) { double res = 0; double total_dist = 0; double dist[4] = {0,0,0,0}; double val[4]; val[0] = d0; val[1] = d1; val[2] = d2; val[3] = d3; - dist[0] = 1.0/(1e-30+(x-x0)*(x-x0)+(y-y0)*(y-y0)); - dist[1] = 1.0/(1e-30+(x-dx-x0)*(x-dx-x0)+(y-y0)*(y-y0)); - dist[2] = 1.0/(1e-30+(x-dx-x0)*(x-dx-x0)+(y-dy-y0)*(y-dy-y0)); - dist[3] = 1.0/(1e-30+(x-x0)*(x-x0)+(y-dy-y0)*(y-dy-y0)); + dist[0] = 1.0/(1e-30 + pow((x-x0)*(x-x0)+(y-y0)*(y-y0), 0.5*p)); + dist[1] = 1.0/(1e-30 + pow((x-dx-x0)*(x-dx-x0)+(y-y0)*(y-y0), 0.5*p)); + dist[2] = 1.0/(1e-30 + pow((x-dx-x0)*(x-dx-x0)+(y-dy-y0)*(y-dy-y0), 0.5*p)); + dist[3] = 1.0/(1e-30 + pow((x-x0)*(x-x0)+(y-dy-y0)*(y-dy-y0), 0.5*p)); + for (int i = 0; i < 4; i++) { total_dist += dist[i]; } + for (int i = 0; i < 4; i++) { res += val[i]*dist[i]/total_dist; diff --git a/lib/algorithm/interpolate.h b/lib/algorithm/interpolate.h index 6718333..ce38ca7 100644 --- a/lib/algorithm/interpolate.h +++ b/lib/algorithm/interpolate.h @@ -133,7 +133,7 @@ namespace gctl /** * @brief 规则网络插值 长方形内数据插值 * - * @note 距离平方反比 + * @note 默认为距离平方反比 * * y * | @@ -157,11 +157,12 @@ namespace gctl * @param[in] d1 d1值 * @param[in] d2 d2值 * @param[in] d3 d3值 + * @param[in] p 距离次方值 默认为2 * * @return 插值点值 */ double rect_interpolate(double x0, double y0, double dx, double dy, double x, double y, - double d0, double d1, double d2, double d3); + double d0, double d1, double d2, double d3, double p = 2.0); /** * @brief 规则网络插值 长方体内数据插值 diff --git a/lib/core/array.h b/lib/core/array.h index ceb5998..ba00579 100644 --- a/lib/core/array.h +++ b/lib/core/array.h @@ -528,8 +528,12 @@ namespace gctl * * @param st_val Start value. * @param inc Increasement. + * @param st_id Start index. + * @param size Operating size. + * @param space Indexing spacing. */ - void sequence(ArrValType st_val, ArrValType inc); + void sequence(ArrValType st_val, ArrValType inc, size_t st_id = 0, + size_t size = std::numeric_limits::max(), size_t space = 0); /** * @brief Assign values as a 2D sequence. @@ -1328,14 +1332,27 @@ namespace gctl } template - void array::sequence(ArrValType st_val, ArrValType inc) + void array::sequence(ArrValType st_val, ArrValType inc, + size_t st_id, size_t size, size_t space) { - //static_assert(std::is_arithmetic::value, - // "gctl::array::sequence(...) could only be used with an arithmetic type."); + if (st_id >= length_) throw std::runtime_error("[gctl::array::sequence] Invalid index."); + size = GCTL_MIN(size, length_); - for (size_t i = 0; i < length_; i++) + if (size > 0) { - val_[i] = st_val + i*inc; + val_[st_id] = st_val; + size--; + + size_t id = st_id; + size_t id2 = st_id + space + 1; + while (id2 < length_ && size > 0) + { + val_[id2] = val_[id] + inc; + + id = id2; + id2 += space + 1; + size--; + } } return; } @@ -1344,9 +1361,6 @@ namespace gctl void array::sequence2d(ArrValType rs, ArrValType rinc, ArrValType cs, ArrValType cinc, size_t rn, size_t cn) { - //static_assert(std::is_arithmetic::value, - // "gctl::array::sequence2d(...) could only be used with an arithmetic type."); - if (rn*cn != length_) { throw invalid_argument("[gctl::array::sequence2d] Invalid sequence sizes."); @@ -1371,9 +1385,6 @@ namespace gctl ArrValType rs, ArrValType rinc, ArrValType cs, ArrValType cinc, size_t ln, size_t rn, size_t cn) { - //static_assert(std::is_arithmetic::value, - // "gctl::array::sequence3d(...) could only be used with an arithmetic type."); - if (ln*rn*cn != length_) { throw invalid_argument("[gctl::array::sequence3d] Invalid sequence sizes.");