2015-05-09 2 views
-1

Я пытаюсь генерировать логарифмический раздельный массив в С.Как создать логарифмический раздельный массив в C

Например, начиная с 100 и заканчивая 500, с 40 логарифмическими разнесенными точками.

Может ли кто-нибудь мне помочь? Существуют ли какие-либо функции logspace()?

ответ

3

Без дополнительных ограничений просто разделите линейный интервал [ln (100) .. ln (500)] на столько же интервалов (равноудаленных), сколько вам нужно. Затем возьмем exp() каждой точки.

0

Массивы всегда используют линейное, целочисленное и n + 1 степпинг. Поэтому вам нужно сопоставить логарифмическую шкалу с линейным индексом. Это можно сделать либо просто используя log (log_index), либо таблицу диапазонов, и линейный поиск. Для log() могут быть приближения, которые лучше всего соответствуют вашим потребностям и быстрее, чем функция полного логарифма (float).

Вы могли бы, например, принимать количество верхнего 1-бита в лог-индекса и использовать следующие п младшие биты в диапазоне индекса:

// 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 бит. Десятичный степпинг был бы более сложным и довольно неэффективным.