Кодирование арифметики предлагает способ сжать данные и может быть полезно для источников данных, имеющих маленький алфавит. Длина арифметического кода, вместо того, чтобы быть зафиксированной относительно количества закодированных символов, зависит от статистической частоты, с которой источник производит каждый символ из своего алфавита. Для длинных последовательностей из источников, скашивавших распределения и маленькие алфавиты, кодирование арифметики сжимается лучше, чем Кодирование методом Хаффмана.
arithenco
и arithdeco
функции поддерживают арифметическое кодирование и декодирование.
Арифметическое кодирование запрашивает статистическую информацию об источнике закодированных данных. В частности, counts
входной параметр в arithenco
и arithdeco
функции перечисляют частоту, с которой источник производит каждый символ в своем алфавите. Можно определить частоты путем изучения набора тестовых данных из источника. Набор тестовых данных может иметь любой размер, который вы выбираете, пока каждый символ в алфавите имеет ненулевую частоту.
Например, прежде, чем закодировать данные из источника, который производит 10 x's, 10 лет и 80 z's в типичном 100 наборах символов тестовых данных, задают
counts = [10 10 80];
В качестве альтернативы, если больший набор тестовых данных из источника содержит 22 x's, 23 года и 185 z's, то задают
counts = [22 23 185];
Закодируйте и декодируйте последовательность из источника, имеющего три символа.
Создайте вектор последовательности, содержащий символы от набора {1,2,3}.
seq = [3 3 1 3 3 3 3 3 2 3];
Установите counts
вектор, чтобы задать энкодер, который производит 10 единиц, 20 пар и 70 троек от типичного 100 наборов символов тестовых данных.
counts = [10 20 70];
Примените арифметические функции энкодера и декодера.
code = arithenco(seq,counts); dseq = arithdeco(code,counts,length(seq));
Проверьте, что декодер выводил соответствия исходная входная последовательность.
isequal(seq,dseq)
ans = logical
1