Fayorg
/
gymnyo-phy-tp8
Archived
1
0
Fork 0

add: powered max/min

This commit is contained in:
Elie Baier 2024-02-24 15:26:17 +01:00
parent f82ff4ca4c
commit 3f3cfe177f
1 changed files with 68 additions and 2 deletions

View File

@ -14,8 +14,8 @@ namespace plt = matplot;
int MIN_ZERO_SEPARATION = 10;
vector<double> findZeroCrossings(const std::vector<double>& data) {
std::vector<double> zeroCrossings;
vector<double> findZeroCrossings(const vector<double>& data) {
vector<double> zeroCrossings;
for (int i = 1; i < data.size(); ++i) {
if (data[i - 1] * data[i] < 0 || data[i - 1] * data[i] == 0) {
@ -33,6 +33,65 @@ vector<double> findZeroCrossings(const std::vector<double>& data) {
return zeroCrossings;
}
pair<double, bool> poweredMax(const vector<double>& data, int n) {
if (data.empty()) {
return {0.0, false}; // If vector is empty, return false
}
unordered_map<double, int> freqMap;
for (double value : data) {
freqMap[value]++;
}
double maxVal = data[0]; // Initialize maxVal with the first element
int maxFreq = freqMap[maxVal];
for (const auto& entry : freqMap) {
if (entry.second >= n && entry.first > maxVal) {
maxVal = entry.first;
maxFreq = entry.second;
}
}
bool found = maxFreq >= n;
return {maxVal, found};
}
std::pair<double, bool> poweredMin(const std::vector<double>& data, int n) {
if (data.empty()) {
return {0.0, false}; // If vector is empty, return false
}
std::unordered_map<double, int> freqMap;
for (double value : data) {
freqMap[value]++;
}
double minVal = std::numeric_limits<double>::max(); // Initialize minVal with maximum double value
int minFreq = freqMap[minVal];
for (const auto& entry : freqMap) {
if (entry.second >= n && entry.first < minVal) {
minVal = entry.first;
minFreq = entry.second;
}
}
bool found = minFreq >= n;
return {minVal, found};
}
std::vector<double> slice(const std::vector<double>& data, int start, int end) {
if (start < 0 || end >= static_cast<int>(data.size()) || start > end) {
std::cerr << "Invalid slice indices." << std::endl;
return {};
}
return {data.begin() + start, data.begin() + end + 1};
}
int main() {
ifstream dataFile;
@ -88,6 +147,13 @@ int main() {
plt::line(xData[zero], -2, xData[zero], 2);
}
// Finding the powered max between 2 zeros
auto max = poweredMax(slice(yData, zeroCrossings[0], zeroCrossings[1]), 5);
auto min = poweredMin(slice(yData, zeroCrossings[1], zeroCrossings[2]), 5);
cout << max.first << endl;
cout << min.first << endl;
// Show the plot
plt::show();