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;
|
int MIN_ZERO_SEPARATION = 10;
|
||||||
|
|
||||||
vector<double> findZeroCrossings(const std::vector<double>& data) {
|
vector<double> findZeroCrossings(const vector<double>& data) {
|
||||||
std::vector<double> zeroCrossings;
|
vector<double> zeroCrossings;
|
||||||
for (int i = 1; i < data.size(); ++i) {
|
for (int i = 1; i < data.size(); ++i) {
|
||||||
if (data[i - 1] * data[i] < 0 || data[i - 1] * data[i] == 0) {
|
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;
|
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() {
|
int main() {
|
||||||
|
|
||||||
ifstream dataFile;
|
ifstream dataFile;
|
||||||
|
@ -88,6 +147,13 @@ int main() {
|
||||||
plt::line(xData[zero], -2, xData[zero], 2);
|
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
|
// Show the plot
|
||||||
plt::show();
|
plt::show();
|
||||||
|
|
||||||
|
|
Reference in New Issue