Октава - код Хаффмана не работает - все элементы 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