我有一个用C实现的公式,我已经这样做但是我得到的结果与matlab不同
代码:
orders
其中x []是元素为0:0.001:255的数组
C中的结果是37022697.82 Matlab中的结果是-12767828.5
为什么会出现如此大的变化以及导致这种变化的原因?
提前致谢
答案 0 :(得分:2)
我猜你的意思是你的数组x[]
包含元素0.0,0.001,0.002 ... 255.0。这是对的吗?
通过这个假设,下面的C代码给出了-12767828.504138,它与您的MATLAB结果一致(在数值精度范围内)。正如评论中指出的那样,你应该对float
和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;
}
答案 1 :(得分:0)
在C中,数组索引从0开始,而不是从1开始。我们只能假设M
是数组x
中的元素数,并且你真的想要包含所有{{1} M
循环中的元素。因此for
的元素范围从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
数组。在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()
也使用弧度。