4

我在使用 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 上运行。

4

1 回答 1

5

你说

因为我的 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 向量的索引向量,从而检索原始符号。IE:

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
于 2021-04-03T11:55:11.480 回答