基本概念
在软件设计中,经常碰到要求产生一个等差或等比的向量数组,如在数字信号处理领域,要求在[x1~x2]之间按线性(本质是等差数组)或对数(本质是等比数组)分布产生N个频点的数组,对于这种问题,在Matlab中提供了两个现成的函数,分别为linspace和logsapce,函数原型说明如下:
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(0.0001)和log10(100000)。
运行结果如下:
结论引申
上面代码完美实现了matlab中两个对应函数的功能。
对于logspace函数,可以再进一步引申,上面代码实现中是以10为底的对数分布,当然也可以产生以任意数值为底的对数分布数组,只需对上面的代码稍微改造下就可实现这个功能,代码如下:
如以2为底,在1到512之间产生对数分布数组为:[1,2,4,8,16,32,64,128,256,512]。
大家如果有更好的实现方法,可加关注留言讨论。
欢迎加关注,共同交流。
领取专属 10元无门槛券
私享最新 技术干货