3
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main () 
{
    double g_1, e_1, e_2, e_3, e_4, e_5; 
    int k;
   // double e[k];

        e_1 = 3.0;
    e_2 = 9.0;
    e_3 = 27.0;
    e_4 = 81.0;
    e_5 = 243.0;


    g_1 = ((e_1*e_2 + e_2*e_3 + e_3*e_4 + e_4*e_5)/5) - (((e_1)* + (e_2) + (e_3) +(e_4) + (e_5)/5)*((e_1)* + (e_2) + (e_3) +(e_4) + (e_5)/5));
printf("\n\n this is g(1): %f",g_1);


return (0);
}

我正在尝试编写一个计算值之间相关性的程序。我拥有的数学函数是自相关函数或数学相关函数

g(T) = sum(from t = 1 to m-T) [ (e_t)*(e_(T+t)] - (sum(from t = 1 to m) [e_t/m] )^2

其中 m 是我拥有的值的数量。

上面我尝试通过取 5 个数字并将它们插入公式来做最简单的版本。但最终我需要能够读取包含从 100 到 5000 的任意数量值的文件并找到它们之间的相关性。我稍后会担心将文件读取到数组的条目中,但首先我想知道是否有使用数组执行此操作的合乎逻辑的方法?

例如,我尝试执行以下操作:

e[1] = 3.0;
    e[2] = 9.0;
    e[3] = 27.0;
    e[4] = 81.0;
    e[5] = 243.0;

for(k=1;k<=5;k++)
    {   
        g[k]= ((e[k]*e[k+1] + e[k+1]*e[k+2] + e[k+2]*e[k+3] + e[k+3]*e[k+4])/5) - (((e[k] + e[k+1] + e[k+2] + e[k+3] + e[k+4])/5)*((e[k] + e[k+1] + e[k+2] + e[k+3] + e[k+4])/5))
             }

但这仅对 k=1 有意义,因为当它达到 k = 5 时,k+1 将是 6,k+2 将是 7.. 我没有这些值.. 但我'不知道究竟如何编程这个..有人可以帮忙吗?

谢谢

这是使用 MathJax 的公式

g(\tau) = \sum_{\tau_{0}=1}^{m-\tau} ((\epsilon_{\tau{_0}} * \epsilon_{\tau+\tau_{0}})/m ) - (\sum_{\tau_{0}=1}^m \epsilon_{\tau_{0}}/m)^2

该公式的另一种形式是:

g(\tau) = <\epsilon_{\tau_{0}}\epsilon_{\tau_{0}+\tau}>-<\epsilon_{\tau_{0}}>^2

其中表示对 a 的期望。

4

2 回答 2

3

这更多的是如何阅读数学表达式问题。在您的示例中,m = 5,因此总和永远不会超出此范围。

我对你的等式并不完全清楚。已经尝试过 Mathjax,但公式对我来说仍然不清楚,但是......

将数学表达式转换为代码时,将求和符号 (sigma) 视为等同于 for 循环!

编写代码时,(最初)以最明确的方式编写。对于这个问题代码,两个 for 循环,一个接一个,没有嵌套。每个 for 循环都执行 g(k) 的部分计算。

让它为 g(1) 工作。然后编写第三个 for 循环,包裹或包围您刚刚开始工作的两个循环。此循环将计算 g(1)、g(2) 等。注意。如果 m 为 5 并且您只有 5 个数据点,那么您只能计算 g(1),如果 m 为 6,您可以计算 g(1) 和 g(2),等等。

希望这会有所帮助,如果您有更多信息或问题,请发布。

为了回答您的评论,以下 for 循环实现了 sum 或 sigma。笔记。这不是您的代码应该做的,但它确实使用两个 for 循环进行演示。

   int g1; x = 0; y = 0;
   int i;

   // compute x = sum(g(i)) + sum(f(i))

   // sum i = 0 to 2 [g(i)]
   for (i=0; i < 3; i++) {x += g[i];}

   // sum i = 0 to 1 [f(i)];
   for (i=0; i < 2; i++) {y += f[i];}

   g1 = x - y^2;
于 2013-08-19T19:11:56.487 回答
1

您正在寻找的C代码将采用以下形式:

  int     tau = 7      
  int     m   = 80;
  double  *e; /* An array filled with m values */
  double  lhs,rhs,answer;
  int     tau0;

  /* Left Summation */
  for(sum=0,tau0=1; tau0 < m-tau; ++tau0)
    sum += e[tau0] * e[tau+tau0]; 
  lhs = sum / m;

  /* Right Summation */
  for(sum=0,tau0=1; tau0 < m; ++tau0)
    sum += e[tau0] / m;
  rhs = sum * sum;

  answer = lhs - rhs;

希望这能让您更接近您的解决方案。

于 2013-08-19T19:39:11.433 回答