diff --git a/230124-sampen/sampen.cpp b/230124-sampen/sampen.cpp index 4cb84428f61abdad2ea5d10bd1625ee308b11ffd..185bc002743918f59b5cdef1c7342fa578134947 100644 --- a/230124-sampen/sampen.cpp +++ b/230124-sampen/sampen.cpp @@ -93,3 +93,61 @@ double FastSampEn_m2(double *X, int N, double r) return 0; return -log(A / B); } + +double FastSampEn_ai(double *X, int N, int m, double r) +{ + int Ai = 0, Bi = 0; + int LoopTimes = N - m + 1; + for (int i = 0; i < LoopTimes; i++) { + for (int j = i + 1; j < LoopTimes; j++) { + double D = fabs(X[i] - X[j]); + for (int k = 1; k < m; k++) { + double t = fabs(X[i + k] - X[j + k]); + if (t > D) + D = t; + } + if (D <= r) + Ai++; + if (j < N - m) { + double t = fabs(X[i + m] - X[j + m]); + if (t > D) + D = t; + if (D <= r) + Bi++; + } + } + } + double s1 = 1.0 * Ai / ((N - m + 1) * (N - m) / 2); + double s2 = 1.0 * Bi / ((N - m) * (N - m - 1) / 2); + if (s1 == 0 || s2 == 0) + return 0; + return -log(s2 / s1); +} + +double FastSampEn_ai_m2(double* X, int N, double r) +{ + int Ai = 0, Bi = 0; + int LoopTimes = N - 1; + for (int i = 0; i < LoopTimes; i++) { + for (int j = i + 1; j < LoopTimes; j++) { + double D = fabs(X[i] - X[j]); + double t = fabs(X[i+1]-X[j+1]); + if (t > D) + D = t; + if (D <= r) + Ai++; + if (j < N - 2) { + double t = fabs(X[i + 2] - X[j + 2]); + if (t > D) + D = t; + if (D <= r) + Bi++; + } + } + } + double s1 = 1.0 * Ai / ((N - 1) * (N - 2) / 2); + double s2 = 1.0 * Bi / ((N - 2) * (N - 3) / 2); + if (s1 == 0 || s2 == 0) + return 0; + return -log(s2 / s1); +} diff --git a/230124-sampen/sampen.h b/230124-sampen/sampen.h index 2d39bdf1b2df13b837dfd522270022b39535d976..9f6d79f42320afe71e2bd1330c1c72908962adc4 100644 --- a/230124-sampen/sampen.h +++ b/230124-sampen/sampen.h @@ -6,3 +6,7 @@ double SampEn(double *X, int N, int m, double r); double FastSampEn(double *X, int N, int m, double r); // 经过优化的且m取2的样本熵 double FastSampEn_m2(double *X, int N, double r); +// 由ChatGPT帮忙优化的代码(经手动调整) +double FastSampEn_ai(double *X, int N, int m, double r); +// 由AI帮忙优化且m取2的样本熵代码 +double FastSampEn_ai_m2(double* X, int N, double r); diff --git a/230124-sampen/test.cpp b/230124-sampen/test.cpp index 171d6fac15601d2dd59ed2e024a0aafa11e3f199..01ac038aaeb26e2e35785e6ff61b14a2399570d9 100644 --- a/230124-sampen/test.cpp +++ b/230124-sampen/test.cpp @@ -20,6 +20,8 @@ int main() std::cout << SampEn(x.data(), x.size(), 2, 3) << '\n'; std::cout << FastSampEn(x.data(), x.size(), 2, 3) << '\n'; std::cout << FastSampEn_m2(x.data(), x.size(), 3) << '\n'; + std::cout << FastSampEn_ai(x.data(), x.size(), 2, 3) << '\n'; + std::cout << FastSampEn_ai_m2(x.data(), x.size(), 3) << '\n'; // 继续添加30000个数据 for (int i = 0; i < 10000; i++) { @@ -45,4 +47,14 @@ int main() se = FastSampEn_m2(x.data(), x.size(), 3); t = clock() - t; std::cout << se << ", time = " << t << " ms\n"; + + t = clock(); + se = FastSampEn_ai(x.data(), x.size(), 2, 3); + t = clock() - t; + std::cout << se << ", time = " << t << " ms\n"; + + t = clock(); + se = FastSampEn_ai_m2(x.data(), x.size(), 3); + t = clock() - t; + std::cout << se << ", time = " << t << " ms\n"; }