从数学函数到c ++代码

时间:2015-10-14 16:44:16

标签: c++

我正在尝试实现这个F(S)函数:

enter image description here

贝娄是我的代码,但无法正常工作:

double EnergyFunction::evaluate(vector<short> field) {
    double e = 0.0;
    for (int k = 1; k < field.size() - 1; k++){
        double c = 0.0;
        for (int i = 1; i < field.size() - k; i++) {
            c += field[i] * field[i + k];
        }
        e += pow(c, 2);
    }
    double f = pow(field.size(), 2) / ( 2 * e );
    return f;
}

例如,F(S)函数应为向量返回值8644:

1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,1,-1,1,-1,1,1,1,-1,-1,1,1,-1,-1,1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,1,1,1,1,-1,1,-1,1,-1,1,1,1,1,1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,1,1,1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,1,1,-1,1,1,1,1,1,-1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,1,1   

我需要另外一双眼睛来看我的代码,因为我在这里有点迷失。 :)

2 个答案:

答案 0 :(得分:2)

您使用相同的名称将变量映射到不同的范围,这总是令人困惑。更好的是保持范围和名称与数学中的相同,并且仅在索引时减去一个0基索引。也可以明确地使用L:

int L = field.size();
for (int k = 1; k <= L-1; k++){
    ...
    for (int i = 1; i <= L-k; i++) {
        c += field[i -1] * field[i+k -1];
    ...

答案 1 :(得分:2)

重构后

double EnergyFunction::evaluate(vector<short> field) {
  double e = 0.0;
  int l = field.size()
  for (int k = 1; k < l; k++){
    double c = 0.0;
    for (int i = 0, j = k; j < l; i++, j++) {
        c += field[i] * field[j];
    }
    e += c*c;
  }
  return l*l / ( e+e );
}

说明:
1.我们需要迭代(L-1)次 2.我们需要移动基线和偏移指数,直到我们到达最后一个 3. c * c和e + e更快更容易阅读