Октава - код Хаффмана не работает - все элементы SIG должны быть целыми числами в диапазоне [1,N]

У меня проблема в Octave с использованием huffmandict и huffmanenco.

Вот моя ошибка:

ошибка: huffmanenco: все элементы SIG должны быть целыми числами в диапазоне [1,N]

Вот мой код:

      inputSig = [1 1 2 6 6 6 6 4 5 5];
list_symb = [1 2 6 4 5];
list_proba = [0.2, 0.1, 0.4, 0.1, 0.2];
dict = huffmandict(list_symb,list_proba);
code = huffmanenco(inputSig,dict);

мой диктат

      dict =
{
 [1,1] =  1
 [1,2] = 0   1
 [1,3] = 0   0   1
 [1,4] = 0   0   0   0
 [1,5] = 0   0   0   1
}

Итак, моя ошибка связана с строкой

      code = huffmanenco(inputSig,dict);

потому что длина моего dict равна 5, а длина моего inputSig равна 10.

Как я могу выполнить кодирование Хаффмана без этой ошибки?

Однако этот код, похоже, работает на Matlab.

1 ответ

Решение

Ты говоришь

потому что длина моего dict равна 5, а длина моего inputSig равна 10.

Не совсем поэтому вы получаете эту ошибку. Из документации:

Ограничение состоит в том, что набор сигналов должен строго принадлежать диапазону «[1,N]» с «N = length (dict)».

Другими словами, ваш 'dict' содержит только 5 ячеек, но ваш 'inputSig' содержит целые числа в диапазоне [1,6] вместо [1,5].

Следовательно, вы в основном должны «перекодировать» / сопоставить свой сигнал в диапазоне [1,5] (т.е. диапазон [1,5] станет индексами / метками в массив ваших фактических символов).

Например

      inputSig   = [1 1 2 6 6 6 6 4 5 5];
list_symb  = unique( inputSig );
list_proba = [0.2, 0.1, 0.4, 0.1, 0.2];
dict       = huffmandict( list_symb, list_proba );
[~, idx]   = ismember( inputSig, list_symb );
code       = huffmanenco( idx, dict )
% code = 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0

PS. В заключение, очевидный следующий вопрос: как это расшифровать, учитывая весь бизнес «фактический символ против индексов». Простой; вы используете декодированный вывод (который соответствует индексам) и используете его как вектор индекса для вектора list_symb, таким образом извлекая исходные символы. Т.е.:

      deco = huffmandeco ( code, dict )
% deco = 1 1 2 5 5 5 5 3 4 4

list_symb( deco )
% ans  = 1 1 2 6 6 6 6 4 5 5
Другие вопросы по тегам