This commit is contained in:
张壹 2024-10-24 12:15:09 +08:00
parent c95b20255a
commit b3122a43c1
5 changed files with 42 additions and 21 deletions

View File

@ -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)
add_example(array_ex ON)

View File

@ -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<double> B = A;
B.normalize();
@ -53,6 +56,10 @@ int main(int argc, char const *argv[]) try
S.normalize();
S.show();
array<point3dc> P(5);
P.sequence(point3dc(0, 0, 0), point3dc(2, 1, 0.5));
P.show(std::cout, '\n');
// create a new 2D array
matrix<int> C(5, 5, 1);
C.sequence(0, 1, 10);

View File

@ -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;

View File

@ -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

View File

@ -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<size_t>::max(), size_t space = 0);
/**
* @brief Assign values as a 2D sequence.
@ -1328,14 +1332,27 @@ namespace gctl
}
template <typename ArrValType>
void array<ArrValType>::sequence(ArrValType st_val, ArrValType inc)
void array<ArrValType>::sequence(ArrValType st_val, ArrValType inc,
size_t st_id, size_t size, size_t space)
{
//static_assert(std::is_arithmetic<ArrValType>::value,
// "gctl::array<T>::sequence(...) could only be used with an arithmetic type.");
if (st_id >= length_) throw std::runtime_error("[gctl::array<T>::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<ArrValType>::sequence2d(ArrValType rs, ArrValType rinc,
ArrValType cs, ArrValType cinc, size_t rn, size_t cn)
{
//static_assert(std::is_arithmetic<ArrValType>::value,
// "gctl::array<T>::sequence2d(...) could only be used with an arithmetic type.");
if (rn*cn != length_)
{
throw invalid_argument("[gctl::array<T>::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<ArrValType>::value,
// "gctl::array<T>::sequence3d(...) could only be used with an arithmetic type.");
if (ln*rn*cn != length_)
{
throw invalid_argument("[gctl::array<T>::sequence3d] Invalid sequence sizes.");