2016-03-18 10 views
0

Ich habe ein Problem mit der Übergabe der Zeichenfolge und Wörterbuch durch die huffmanenco Funktion. Ich habe fast alles ausprobiert, aber ich bekomme immer wieder den Fehler, dass das Huffman-Wörterbuch nicht alle Eingabecodes hat. Aber ich bin mir sicher, dass es so ist.Huffman Wörterbuch hat nicht die Codes für alle Eingangssignale

%% 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); 

Antwort

1

Sie tun nicht haben alle Zeichen in Ihrem Wörterbuch. Sie können dies leicht überprüfen mit ismember auf Ihren Wörterbuchsymbolen und Ihrem Eingangssignal. Ich erhalte die folgende Liste von Zeichen, die in Ihrem Wörterbuch nicht vorhanden sind.

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' '-' 

Es kann einfacher sein (und möglicherweise robuster) einen ASCII-Code-Bereich verwenden, um Ihr Wörterbuch zu erzeugen, so können Sie sicherstellen, dass Sie alle Grund Zeichen erfassen Sie fangen möchten.

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

Nachtrag

Ich bin mir nicht ganz sicher, was Sie mit diesem Code Chunk tun

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

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

Wenn Sie die numerische Darstellung Ihrer Zeichenfolge möchten, können Sie immer werfen Es verwendet den gewünschten Datentyp.

uint8(str); 
double(str); 

Dann, wenn Sie so einen String bis teilen wollen, dass es ein Zellenfeld ist, wobei jedes Element ein separates Zeichen ist, können Sie num2cell verwenden.

cellArray = num2cell(str); 
Verwandte Themen