C++算法集锦

一、在两个值之间均匀取值

int Len=10;
double *temp = new double[Len];
double x=AdjustValue;

temp=UniformSampling(1-x,1+x,Len);
//函数功能:均匀取点算法
double *MainWindow::UniformSampling(double Mmin,double Mmax,int L)
{
    double *temp = new double[L];
    double delta=(Mmax-Mmin)/(L-1);

    for(int i=0;i<L;++i)
    {
        temp[i]=Mmin+delta*i;
    }
    return temp;
}

二、在对数横坐标下的类正态分布函数

如下图所示,横坐标是对数坐标系,纵坐标是正常坐标系。带灰色阴影的是我们用函数产生的类正态分布曲线。
基本思想是:首先得到在常规坐标系下的正态分布函数,然后为了在横坐标转换为对数坐标系后,曲线的形态不变。那么本来曲线的对称轴是x=u,坐标系转换后,对称轴就变为x=log(u),注意C++中的log函数是以自然对数e为底的。同理,其他的x坐标也是变为log(x)。
在这里插入图片描述

//使用方式
//产生用于绘图的数据
for(int i=0;i<2000;i++)
{
	//gaussrand函数的定义在后面
   data2 << gaussrand(log(i*10),log(800),12);
}

//绘图
QVector<double> xx;
for(int i=0;i<2000;i++)
{
    xx <<10*i;
}
CustomPlot->graph(1)->setData(xx,data2);

//函数功能:类高斯分布
//函数参数:value是横坐标下的输入值;u是正态分布的期望值;Amp是正态分布的顶点幅度
//函数返回值:纵坐标下的输出值
double MainWindow::gaussrand(double value,double u,double Amp)
{
	//sigma是标准差,决定了类正态分布的曲线胖瘦
    double sigma=0.3;
    double mvalue=Amp*exp(-(value-u)*(value-u)/(2*sigma*sigma));
    //qDebug()<<mvalue1;
    return mvalue;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kissgoodbye2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值