C语言编程系列007—实现linspace和logspace

基本概念

在软件设计中,经常碰到要求产生一个等差或等比的向量数组,如在数字信号处理领域,要求在[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]。

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

欢迎加关注,共同交流。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180913A0SLOG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券