0

我有一个我在 C 中实现的公式,我已经这样做了,但是我收到的结果与 matlab 不同

编码:

  double sumVector(float x[], int M){


        double y = 0;
        int i;

        for(i = 1; i<M ; i++){


            y += (0.5*x[i]) + ((x[i])*(x[i])* (cos(floor(x[i]/4) - 32)));


        }

        return y;
    }

其中 x[] 是一个元素为 0:0.001:255 的数组

C 中的结果是 37022697.82 Matlab 中的结果是 -12767828.5

为什么会有如此大的变化,是什么原因造成的?

提前致谢

4

2 回答 2

2

我猜你的意思是你的数组x[]包含元素 0.0、0.001、0.002 ... 255.0。那是对的吗?

在此假设下,以下 C 代码给出 -12767828.504138,这与您的 MATLAB 结果一致(在数值精度范围内)。正如评论中指出的那样,您应该小心floatand double,并且您可能希望您的函数循环遍历x 的所有元素,包括 x[0]。除此之外,我不知道您如何初始化数组以及如何调用该函数。

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

double sumVector(double x[], int M){


  double y = 0.0;
  int i;

  for(i = 0; i<M ; i++){


    y += (0.5*x[i]) + ((x[i])*(x[i])* (cos(floor(x[i]/4.0) - 32.0)));


  }

  return y;
}

int main()
{
  const int M = 255001;
  const double delta = 0.001;
  double *x = malloc(M * sizeof(double));
  int i;

  // Fill the array. Is that what you want?
  for(i = 0; i < M; i++) {
    x[i] = i * delta;
  }

  printf("Result = %f\n", sumVector(x, M));

  free(x);

  return 0;
}
于 2016-02-04T02:28:11.847 回答
0

@WeatherVane 和 @TroyHaskin 在评论中为您的问题提供了答案:您可能没有正确地遍历您的数组,因此您在 C 中的向量计算可能不是您想要的。(我们只能假设您的 Matlab 实现是正确的。)

在 C 语言中,数组索引从 0 开始,而不是 1。我们只能假设这M是数组中元素的数量,x并且您确实希望在循环中包含所有M元素。for所以xrange from x[0]through的元素x[M-1]。在您的代码中,您没有x[0]在计算中包含第一个元素。试试这个:

double sumVector(double x[], int M) {
  double y = 0.0;
  int i;

  for(i=0; i<M; i++){
    y += 0.5*x[i] + x[i]*x[i]*cos(floor(x[i]/4.0) - 32.0));
  }
  return y;
}

请注意,我已将您的类型更改xdouble. 在 Matlab 中,是浮点数double的默认精度。认为 C 语言也是如此:double除非你真的知道自己在做什么,否则使用。

这种i=0; i<MAX; i++格式是 C 中的常见做法。习惯它。开始i=1或测试应该看起来很奇怪i<=MAX。(这并不意味着它一定是错误的,但它应该引起人们的注意。)

此外,@Olaf 的评论警告您要小心 C 中的除法。如果两个操作数都是整数类型,它将执行整数除法。例如,如果您使用1.0 而不是 1,它会强制浮点除法。它还使人类读者更清楚您使用的是浮点常量而不是整数常量。

在 Matlab 中,cos接受弧度,C 库cos()也使用弧度。

于 2016-02-04T02:36:47.583 回答