2015-10-14 52 views
3

我想实现这个F(S)功能:从数学函数的C++代码

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 

我需要另一个眼睛看在我的代码中,因为我在这里有点迷路。 :)

+0

是的抱歉,我试图说,我忘了改回来,发布时在stackoverflow上 – TomazStoiljkovic

+0

看来,你没有正确地将范围[1,L]映射到范围[0,size-1]。 –

+0

是的L是大小,在我们的情况下是305。 – TomazStoiljkovic

回答

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更快,更容易阅读

+0

正如你发现:-),重构正确是很困难的。我建议先在数学中进行重构,然后直接复制到代码中。 –

+0

@jeffy已经完成;) –

2

您正在使用相同的名称将变量映射到不同的范围,这总是会令人困惑。更好的做法是保持范围和名称与数学中相同,并且在索引时仅减去0基索引的索引。也不妨用左旋明确:

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]; 
    ...