我写了一些数学函数在我的程序中使用,它们会被大量使用。我想提供代码,看看a)是否有逻辑改进,b)是否有更好的方法来做这些。它是一个头文件,包含在需要的地方。
我不是为 c++11 编译的,所以请记住这一点。- 我也知道负数的 rootDouble 在数学上是不正确的。
我认为可能出现的第一件事是将矢量输入转换为通过引用传递,欢迎对此发表评论。
就我接受答案而言,我想知道可以改进哪些功能以及如何改进这些功能以提高速度。
++ 我很快就发布了这个,希望我没有在里面留下任何令人尴尬的错误!
#ifndef MATHSFUNCTIONS_H_
#define MATHSFUNCTIONS_H_
#include <algorithm>
#include <vector>
#include <numeric>
#include <cmath>
class MathsFunctions {
public:
MathsFunctions();
virtual ~MathsFunctions();
inline static double squareDouble(double input) {
return input * input;
}
inline static double rootDouble(double input) {
if (input == 0.0) {
return 0.0;
} else if ( input < 0.0) {
input = flipDouble(input);
input = sqrt(input);
return flipDouble(input);
}
return sqrt(input);
}
inline static double flipDouble(double input) {
return input * -1;
}
inline static double rangeInVec(std::vector<double> inputs) {
return maxInVec(inputs) - minInVec(inputs);
}
inline static double stdDevInVec(std::vector<double> inputs) {
if (inputs.size() < 2) {return 0.0;}
double mean = meanInVec(inputs);
double sq_sum = std::inner_product(inputs.begin(), inputs.end(), inputs.begin(), 0.0);
return std::sqrt(sq_sum / inputs.size() - mean * mean);
}
inline static double meanInVec(std::vector<double> inputs) {
double sum = std::accumulate(inputs.begin(), inputs.end(), 0.0);
return sum / inputs.size();
}
inline static double sumOfVec(std::vector<double> inputs) {
double total = 0.0;
for (unsigned int var = 0; var < inputs.size(); ++var) {
total += inputs[var];
}
return total;
}
inline static double maxInVec(std::vector<double> inputs) {
bool first = true;
double max;
for (unsigned int var = 0; var < inputs.size(); ++var) {
if (first) {
max = inputs[var];
first = false;
} else {
if (inputs[var] > max) {
max = inputs[var];
}
}
}
return max;
}
inline static double minInVec(std::vector<double> inputs) {
bool first = true;
double min;
for (unsigned int var = 0; var < inputs.size(); ++var) {
if (first) {
min = inputs[var];
first = false;
} else {
if (inputs[var] < min) {
min = inputs[var];
}
}
}
return min;
}
inline static std::vector<double> weightValueVector(std::vector<double> inputs,std::vector<double> weights) {
std::vector<double> results;
for (unsigned x = 0; x < inputs.size(); ++x) {
results.push_back(inputs[x] * weights[x]);
}
return results;
}
};
#endif /* MATHSFUNCTIONS_H_ */