我试图用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
答案 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