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

p1iqtdky  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(272)

我有一个用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

为什么会有这么大的差异,是什么原因造成的?

sdnqo3pr

sdnqo3pr1#

我猜您的意思是数组x[]包含元素255.0、0.001、0.002……0.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;
}
qlckcl4x

qlckcl4x2#

@weathervane和@troyHaskin在评论中为您的问题提供了答案:您可能没有正确地迭代数组,因此您在C中的向量计算可能不是您想要的结果。(我们只能假设您的Matlab实现是正确的。)
在C中,数组索引从0开始,而不是从1开始。我们只能假设M是数组x中的元素数,并且您确实希望在for循环中包含所有M元素。所以x的元素范围从x[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的类型更改为double数组。在MatLab中,浮点数的double is the default precision。假设C也是如此:除非您真正知道自己在做什么,否则请使用double
这种i=0; i<MAX; i++是C中的常见做法。从i=1开始或测试i<=MAX看起来应该很奇怪。(这并不意味着它一定是错的,但它应该吸引眼球。)
此外,@Olaf的注解警告您要小心C中的除法。如果两个操作数都是整数类型,它将执行整数除法。例如,如果使用1.0 instead of 1,则会强制使用浮点除法。它还让读者更清楚地知道,您使用的是浮点常量,而不是整数常量。
在Matlab中,cos accepts radians和C库cos()也使用弧度。

相关问题