add: powered max/min
This commit is contained in:
parent
f82ff4ca4c
commit
3f3cfe177f
70
main.cpp
70
main.cpp
|
@ -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();
|
||||
|
||||
|
|
Reference in New Issue