-1

I have a table about inverse gamma correction these are the values coresponding from 0 to 256 down there. I need a way to calculate the inverse of this function -> something like 0, 2, 6, 9, ...

I would appreciate it, if someone could tell me a freeware tool that could do that or an algorithm I could write in C.

0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 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, 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, 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 243, 246, 249, 253,

Dimitar Slavchev
  • 1,597
  • 3
  • 16
  • 20
  • 2
    You mean you need a program that will find the index of the first occurrence of a given number in an array? You could program that yourself, or otherwise use the C library function strchr. Also you probably want to remove one of the two words "function" from your title. –  Dec 12 '11 at 12:35

3 Answers3

1

You are asking how to invert a lookup table for a nondecreasing function. This isn't pretty (or even tested), but it might work in 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;
}

Or, in Perl (shown: on windows; on linux, you would interchange ' and "):

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, ..."

This question, as formulated (no real question about Gamma Correction) probably belongs in another forum.

bgins
  • 128
  • 5
0

You are dealing with a sorted array of numbers, so use a binary search.

Michael J. Barber
  • 24,518
  • 9
  • 68
  • 88
0

In shell:

 awk -F ',' '{ if (FNR == 1 || $1 != l) print FNR-1; l = $1; }'
thiton
  • 35,651
  • 4
  • 70
  • 100