Skip to content

Commit

Permalink
feat: Added Smooting extension method.
Browse files Browse the repository at this point in the history
  • Loading branch information
mathrunet committed Dec 4, 2023
1 parent 2169a84 commit e474c9a
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 0 deletions.
30 changes: 30 additions & 0 deletions packages/katana/lib/extension/double_iterable_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,34 @@ extension DoubleIterableExtensions on Iterable<double> {
}
return reduce((a, b) => a < b ? a : b);
}

/// Smooth this array with [n] moving averages.
///
/// [n] must be an odd number.
///
/// この配列を[n]個の移動平均で平滑化します。
///
/// [n]は奇数である必要があります。
List<double> smoothing({int n = 3}) {
assert(3 % 2 == 1, "n must be odd number");
final array = toList();
final halfN = (n / 2).floor();
final result = <double>[];
for (int i = 0; i < array.length; i++) {
int start = i - halfN;
int end = i + halfN;
if (start < 0) {
start = 0;
}
if (end >= array.length) {
end = array.length - 1;
}
double sum = 0;
for (int j = start; j <= end; j++) {
sum += array[j];
}
result.add(sum / (end - start + 1));
}
return result;
}
}
30 changes: 30 additions & 0 deletions packages/katana/lib/extension/int_iterable_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -123,4 +123,34 @@ extension IntIterableExtensions on Iterable<int> {
}
return reduce((a, b) => a < b ? a : b);
}

/// Smooth this array with [n] moving averages.
///
/// [n] must be an odd number.
///
/// この配列を[n]個の移動平均で平滑化します。
///
/// [n]は奇数である必要があります。
List<double> smoothing({int n = 3}) {
assert(3 % 2 == 1, "n must be odd number");
final array = toList();
final halfN = (n / 2).floor();
final result = <double>[];
for (int i = 0; i < array.length; i++) {
int start = i - halfN;
int end = i + halfN;
if (start < 0) {
start = 0;
}
if (end >= array.length) {
end = array.length - 1;
}
double sum = 0;
for (int j = start; j <= end; j++) {
sum += array[j];
}
result.add(sum / (end - start + 1));
}
return result;
}
}
4 changes: 4 additions & 0 deletions packages/katana/test/double_iterable_extensions_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,8 @@ void main() {
final doubles = [1.0, 2.0, 3.0, 4.0];
expect(doubles.standardDeviation(), 1.118033988749895);
});
test("DoubleIterableExtensions.smoothing", () {
final doubles = [1.0, 9.0, 5.0, 4.0, 3.0];
expect(doubles.smoothing(), [5.0, 5.0, 6.0, 4.0, 3.5]);
});
}
4 changes: 4 additions & 0 deletions packages/katana/test/int_iterable_extensions_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,8 @@ void main() {
final ints = [1, 2, 3, 4];
expect(ints.standardDeviation(), 1.118033988749895);
});
test("IntIterableExtensions.smoothing", () {
final ints = [1, 9, 5, 4, 3];
expect(ints.smoothing(), [5, 5, 6, 4, 3.5]);
});
}

0 comments on commit e474c9a

Please sign in to comment.