2016-03-18 4 views
0

У меня, кажется, проблема с передачей строки и словаря через функцию huffmanenco. Я пробовал почти все, но я все время получаю ошибку, что словарь Хаффмана не имеет всех кодов ввода. Но я уверен, что это так.Словарь Хаффмана не имеет кодов для всех входных сигналов

%% HUFFMAN TEST 
clear all; close all; clc; 


sig = ['a'; 'b'; 'c'; 'd'; 'e'; 'f'; 'g'; 'h'; 'i'; 'j';... 
      'k'; 'l'; 'm'; 'n'; 'o'; 'p'; 'q'; 'r'; 's'; 't';... 
      'u'; 'v'; 'w'; 'x'; 'y'; 'z'; ':'; ' '; ','; '.']; 



% Get probability 
char_count = zeros(30,1); 

for i = 1:30 
    for c = sig(i) 
     char_count(i,1) = length(find(sig == c)); 
    end 
end 

sym_prob = char_count/sum(char_count); 


% Huffman Dictionary 
% symbols = cellstr(symbols); % Still doesn't work in huffmandict, so try manually typing out again with curly braces 
sig = {'a'; 'b'; 'c'; 'd'; 'e'; 'f'; 'g'; 'h'; 'i'; 'j';... 
      'k'; 'l'; 'm'; 'n'; 'o'; 'p'; 'q'; 'r'; 's'; 't';... 
      'u'; 'v'; 'w'; 'x'; 'y'; 'z'; ':'; ' '; ','; '.'}; 

[dict, aveLength] = huffmandict(sig, sym_prob); 


% Process signal 
str = 'A technique is developed to construct a representation of planar objects undergoing a general affine transformation. The representation can be used to describe planar or nearly planar objects in a three-dimensional space, observed by a camera under arbitrary orientations.'; 
str_int = bin2dec(dec2bin(str)); 

sig = cell(size(str)); 
for i = 1:length(str) 
    sig{i} = char(str_int(i)); 
end 


% Encode & Decode 
sig_enco = huffmanenco(sig, dict); 
dsig = huffmandeco(sig_enco, dict); 

ответ

1

Вы не есть все символы, присутствующие в словаре. Вы можете легко проверить это, используя ismember на словарных символах и вашем входном сигнале. Я получаю следующий список символов, которых нет в вашем словаре.

dictionary_symbols = { ... 
     'a'; 'b'; 'c'; 'd'; 'e'; 'f'; 'g'; 'h'; 'i'; 'j';... 
     'k'; 'l'; 'm'; 'n'; 'o'; 'p'; 'q'; 'r'; 's'; 't';... 
     'u'; 'v'; 'w'; 'x'; 'y'; 'z'; ':'; ' '; ','; '.'}; 

[isListed, ind] = ismember(sig, dictionary_symbols); 

sig(~isListed) 

    'A' 'T' '-' 

Это может быть проще (и, возможно, более надежным), чтобы использовать диапазон ASCII-код, чтобы сгенерировать словарь, чтобы вы могли убедиться, что вы захватить все основных символов, которые вы намерены ловить.

dictionary_symbols = num2cell(char(' ':'~')).'; 
probabilities = ones(size(dictionary_symbols)) ./ numel(dictionary_symbols); 

Добавление

Я не совсем уверен, что вы делаете с этим кодом кусок

% Process signal 
str_int = bin2dec(dec2bin(str)); 

sig = cell(size(str)); 
for i = 1:length(str) 
    sig{i} = char(str_int(i)); 
end 

Если вы хотите, чтобы числовое представление вашей строки, вы всегда можете бросить он использует желаемый тип данных.

uint8(str); 
double(str); 

Затем, если вы хотите, чтобы разбить строку таким образом, что это массив ячеек, где каждый элемент представляет собой отдельный символ, вы можете использовать num2cell.

cellArray = num2cell(str);