八度 - 霍夫曼代码不起作用 - SIG 的所有元素都必须是 [1,N] 范围内的整数
Octave - Huffman code doesn't work - All elements of SIG must be integers in the range [1,N]
我在 Octave 中使用 huffmandict 和 huffmanenco 时遇到问题。
这是我的错误:
error: huffmanenco: all elements of SIG must be integers in the range
[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);
因为我的字典的长度是 5 而我的 inputSig 的长度是 10。
如何在不出现此错误的情况下进行哈夫曼编码?
但是,这段代码似乎可以在 Matlab 上运行。
你说
because the length of my dict is 5 and the length of my inputSig is 10.
这不是您收到此错误的原因。来自文档:
A restriction is that a signal set must strictly belong in the range '[1,N]' with 'N = length (dict)'.
换句话说,您的 'dict' 仅包含 5 个单元格,但您的 'inputSig' 包含 [1,6] 范围内的整数而不是 [1,5]。
因此,您基本上必须 'recode' / 将您的信号映射到 [1,5] 范围内(即范围 [1,5] 将变为 indices/labels,到您的数组实际符号)。
例如
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。为了完成,下一个明显的问题是你如何解码这个,给定整个 'actual symbol vs indices' 业务。简单的;您使用解码输出(对应于索引)并将其用作 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
我在 Octave 中使用 huffmandict 和 huffmanenco 时遇到问题。
这是我的错误:
error: huffmanenco: all elements of SIG must be integers in the range [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);
因为我的字典的长度是 5 而我的 inputSig 的长度是 10。
如何在不出现此错误的情况下进行哈夫曼编码?
但是,这段代码似乎可以在 Matlab 上运行。
你说
because the length of my dict is 5 and the length of my inputSig is 10.
这不是您收到此错误的原因。来自文档:
A restriction is that a signal set must strictly belong in the range '[1,N]' with 'N = length (dict)'.
换句话说,您的 'dict' 仅包含 5 个单元格,但您的 'inputSig' 包含 [1,6] 范围内的整数而不是 [1,5]。
因此,您基本上必须 'recode' / 将您的信号映射到 [1,5] 范围内(即范围 [1,5] 将变为 indices/labels,到您的数组实际符号)。
例如
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。为了完成,下一个明显的问题是你如何解码这个,给定整个 'actual symbol vs indices' 业务。简单的;您使用解码输出(对应于索引)并将其用作 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