C ++生成的数据的平滑性

时间:2014-04-10 22:20:04

标签: c++ matlab

我试图用C ++绘制一个函数(高斯函数)。问题是输出不平滑,情节看起来很锯齿。下面我附加了一个用MATLAB和另一个用C ++制作的相同函数的输出(注意:Plot被放大,所以只是函数的峰值是可见的,以澄清差异)。这是C ++代码:

#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main(){        
    int matrix = 100000;
    long double y[matrix], x=0.0, step=0.1;
    double FWHM = 1000, alpha;
    alpha = FWHM/(2*log(2));
    for (int i=0; i<matrix; i++) {
        x = x + step;
        y[i] = exp(-pow((x-3000.0),2.0)/pow(alpha,2.0));
        }
}

这是MATLAB代码:

matrix = 100000;
x=0.0; step=0.1;
FWHM = 1000; 
    alpha = FWHM/(2*log(2));

    for i=1:matrix
        x = x + step;
        y(i) = exp(-((x-3000.0).^2.0)/alpha.^2.0);
    end

enter image description here

1 个答案:

答案 0 :(得分:2)

您如何存储数据并绘制图表?基于图形,我认为你将y [i]转储到文本文件中,从matlab中读取并绘制它们。另外我怀疑你在打印时没有设置精度。如果您没有设置精度,则默认值为6,因此输出将如您所提到的那样呈锯齿状(例如,图表和输出中的1&#11;)

通常,将双数据转储到文本文件中并不是一个好主意,因为您将失去精度。使用二进制数据,如hdf5,protobuf等......

std::cout << y[i] << std::endl;
std::cout << std::setprecision(16) << y[i] << std::endl;

# without std::setprecision. There are 11 of 1's. The graph has 11 of 1's too.
0.999998
0.999998
0.999999
0.999999
0.999999
1
1
1
1
1
1
1
1
1
1
1
0.999999
0.999999
0.999999
0.999998

# with std::setprecision
0.999998078189791
0.9999984433334466
0.9999987700410408
0.9999990583125361
0.9999993081478993
0.9999995195471015
0.9999996925101183
0.9999998270369299
0.9999999231275207
0.9999999807818797
1
0.9999999807818797
0.9999999231275207
0.9999998270369299
0.9999996925101183
0.9999995195471015
0.9999993081478993
0.9999990583125361
0.9999987700410408
0.9999984433334466