基本概念
在软件设计中,经常会遇到需要生成等差或等比的矢量阵列,例如在数字信号处理领域。必须根据[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]。
大家如果有更好的实现方法,可加关注留言讨论。
欢迎加关注,共同交流。