我想在C中生成一个对数间隔数组。
例如,从100开始到500结束,有40个对数间隔点。
任何人都可以帮助我吗?是否有可用的logspace()函数?
答案 0 :(得分:3)
没有进一步的约束,只需将线性区间[ln(100)... ln(500)]分成多个子区间(等距)即可。然后取每个点的exp()。
答案 1 :(得分:1)
数组总是使用线性,整数和n + 1步进。因此,您必须将对数标度映射到线性索引。这可以通过简单地采用log(log_index)或范围表和线性搜索来完成。对于log(),可能会有更好的近似值,并且比完全成长(浮点)对数函数更快。
例如,您可以获取log-index中最高1位的数字,并使用接下来的n个较低位作为range-index:
// all vars are size_t (unsigned at least!)
base_index = get_number_of_uppermost_bit(log_index);
shift = (base_index > 3U) ? (base_index - 3U) : 0;
lin_index = base_index * 8U + ((log_index >> shift) & (8U-1U);
值8和3(ld(8))是每个对数范围的条目数。注意这些是线性的(有时是可接受的近似值)。您也可以将算法应用于较低位,但是获取整数对数函数。但上述情况更快,可能就足够了。或者,您可以使用查找表作为低3位。 小数步进将更加困难,效率也非常低。