Matlab余弦和C余弦函数的差异

时间:2016-02-04 01:09:05

标签: c matlab cosine variation

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

代码:

orders

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

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

为什么会出现如此大的变化以及导致这种变化的原因?

提前致谢

2 个答案:

答案 0 :(得分:2)

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

通过这个假设,下面的C代码给出了-12767828.504138,它与您的MATLAB结果一致(在数值精度范围内)。正如评论中指出的那样,你应该对floatdouble小心,你可能希望你的函数循环遍历 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;
}

答案 1 :(得分:0)

@WeatherVane和@TroyHaskin在评论中对你的问题有一个答案:你可能没有正确地迭代你的数组,所以你在C中的向量计算可能不是你想要的。 (我们只能假设您的Matlab实现是正确的。)

在C中,数组索引从0开始,而不是从1开始。我们只能假设M是数组x中的元素数,并且你真的想要包含所有{{1} M循环中的元素。因此for的元素范围从xx[0]。在您的代码中,您未在计算中包含第一个元素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; } 的类型更改为x数组。在Matlab中,double is the default precision的浮点数。认为对C来说也是如此:使用double,除非你真的知道自己在做什么。

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

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

在Matlab中,cos accepts radians和C库cos()也使用弧度。