您的位置 首页 > 数码极客

【logspace】C/C++语言编程系列007——实现linspace和logspace函数的方法

基本概念

在软件设计中,经常会遇到需要生成等差或等比的矢量阵列,例如在数字信号处理领域。必须根据[x1 ~ x2]之间的线性(本质上是等差阵列)或对数(本质上是等比阵列)分布生成N个频率阵列。关于这个问题,Matlab提供。

1,y=linspace(x1,x2,n),功能是生成x1,x2之间的n点行线性矢量数组。其中x1、x2和n分别是起始值、结束值和元素数。

2、y=logspace(a, b, n),功能是产生从10的a次方到10的b次方之间按对数等分的n个元素的行向量数组。

在C/C++语言的标准库中没有现在的函数实现,下面给出具体的实现思路及代码。

linspace函数的实现

对于在x1,x2之间按线性分布产生n个点的等差数组linspace函数,其实现方法较为简单,思路:第i个点的公式表示为:y[i]=x1+i*d,其中,i范围为[0~n-1],d为元素之间的间隔:d= (x2-x1)/(n-1)。C/C++语言具体实现代码如下:

在上面代码中,产生的等差向量数组放在指针y对应的数组中。

logspace函数的实现

对于在10的a次方到10的b次方之间按对数分布产生n个点的等比数组logspace函数,其实现稍微复杂些。先求公比q的值为:10的((b-a)/n-1)次方,则第i个点的公式表示为:

其中,i范围为[0~n-1]。C/C++语言具体实现代码如下:

在上面代码中,产生的等比向量数组放在指针y对应的数组中。

代码测试例子

调用上面2个函数,测试代码如下:

需要说明的是,代码中对于logspace函数的验证,要求在0.0001到100000之间产生对数分布,所以对应的a和b的值分别为log10)和log10(100000)。

运行结果如下:

结论引申

上面代码完美实现了matlab中两个对应函数的功能。

对于logspace函数,可以再进一步引申,上面代码实现中是以10为底的对数分布,当然也可以产生以任意数值为底的对数分布数组,只需对上面的代码稍微改造下就可实现这个功能,代码如下:

如以2为底,在1到512之间产生对数分布数组为:[1,2,4,8,16,32,64,128,256,512]。

大家如果有更好的实现方法,可加关注留言讨论。

欢迎加关注,共同交流。

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐