Обращение функции дискретной функции.
У меня есть таблица об обратной гамма-коррекции. Эти значения лежат там в диапазоне от 0 до 256. Мне нужен способ для вычисления обратной функции -> что-то вроде 0, 2, 6, 9, ...
Я был бы признателен, если бы кто-нибудь сказал мне бесплатный инструмент, который мог бы сделать это, или алгоритм, который я мог бы написать на C.
0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 43, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 113, 114, 115, 116, 118, 119, 121, 122, 123, 125, 126, 128, 129, 131, 132, 134, 135, 137, 138, 140, 142, 143, 145, 147, 148, 150, 152, 154, 156, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 178, 180, 182, 184, 187, 189, 191, 194, 196, 199, 201, 204, 207, 209, 2 12, 215, 218, 221, 224, 227, 230, 233, 236, 239, 243, 246, 249, 253,
3 ответа
Вы спрашиваете, как инвертировать таблицу поиска для неубывающей функции. Это не красиво (или даже проверено), но может работать в C:
const int N=256;
extern int nondecreasing_sequence[N];
int invert_nondecreasing_sequence(int* sequence, int* inverse)
{
int x=0, y=*sequence++, inverse_length=1;
for (*inverse++=y; ++x<N; sequence++)
{
if (y < *sequence)
{
*inverse++ = y = *sequence;
inverse_length++;
}
}
return inverse_length;
}
Или в Perl (показано: в Windows; в Linux вы должны поменять местами 'и "):
perl -e "@a=map{split/,\s*/}@ARGV;@b=(0,grep{$a[$_]>$a[$_-1]}1..$#a);print join(', ',@b).chr(10)" "0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, ..."
Этот вопрос в том виде, в котором он сформулирован (нет реального вопроса о гамма-коррекции), вероятно, принадлежит другому форуму.
В ракушке:
awk -F ',' '{ if (FNR == 1 || $1 != l) print FNR-1; l = $1; }'
Вы имеете дело с отсортированным массивом чисел, поэтому используйте бинарный поиск.