2013-11-25 4 views
1

Я пытаюсь декодировать массив из 1 и 0 с использованием кодирования с переменной длиной. Например, если строка [1 0 1 1] и A = [1 0] и B = [1 1], моя программа должна дать мне строку, например: ['A', 'B'].Как заполнить пустой массив символов?

Я первый создал пустой массив символов x = repmat(char(0),1,10)

Но теперь, когда я обнаружить кодовое слово, используя для цикла и если заявления, как добавить символ в массив x? Будет ли отображаться символ в декодированной строке?

ответ

0

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

Предполагая, что вы хотите заранее выделить длину x, вы можете присвоить символ к элементу х непосредственно:

% Preallocate x 
x = repmat(char(0),1,10); 

% Assign a character to x 
x(1) = 'A'; 

Где вы можете заменить 1 с любым элементом в массиве.

Задача состоит в том, что вам необходимо отслеживать, где вы находитесь, в этом предварительно распределенном массиве. Если вы уже написали символы в позиции 1, 2 и 3, вам нужно знать, что следующее назначение будет записываться в 4-й элемент x: x(4) = ....

Более элегантное решение может быть следующим:

x = []; 
if foundLetter 
    x(end) = 'A'; 
end 

Это добавляет письмо A к концу предопределенного массива символов x. Это не требует, чтобы вы предварительно выделили длину x.

+0

Второй фрагмент кода возвращает ошибку, если длина x равна нулю. >> x (end) = 2 Попытка доступа к x (0); индекс должен быть положительным целым или логическим. Даже если он был предварительно выделен и имеет длину, отличную от нуля, последний элемент x просто будет переписываться, правильно? Необходимо обновить переменную счетчика или использовать итерированную переменную в цикле for в зависимости от того, как выполняется декодирование. – Falimond

+0

Я получаю сообщение об ошибке. Моя программа проверяет каждый бит в коде один за другим. Предположим, что A = [1 1], B = [1 0 1] и C = [1 0 0]. Например, если мое кодовое слово code = [1 0 1 1 1], оно сначала проверит код (n), где n = 1. Если code (n) == 1, он проверяет, является ли код (n + 1) == 0. Тогда, если это правда, он проверяет код (n + 3). Если код (n + 3) == 1, то он знает, что он сохраняет букву как «B», иначе она будет храниться как C. Проблема возникает, когда короткое кодовое слово. Как будто это [1 0 1]. Когда он проверяет код (n + 3), он ничего не находит, потому что кодовое слово закончилось, поэтому оно возвращает ошибку. Как это исправить? – Kaya311

+0

@ Kaya311 Посмотрите, помогает ли код, который я добавил. Вы должны иметь возможность легко расширять словарь или вносить небольшие изменения, если это необходимо. Конечно, это не включает проверку поврежденного сообщения - предполагает вполне достоверное сообщение без неизвестных кодовых последовательностей. – Falimond

0

Вы можете проиндексировать массив символов x так же, как и массив парных разрядов.

x(1) = 'A'; %Assign the char 'A' to the first element of x 
. 
. 
. 
x(10) = 'B'; %Assign the char 'B' to the tenth element of x 

Вот краткий пример того, что вы хотели бы сделать.

clear decodedMsg 
% define a dictionary between codes and corresponding characters 
code{1,1} = 'A'; code{1,2} = '11'; 
code{2,1} = 'B'; code{2,2} = '101'; 
code{3,1} = 'C'; code{3,2} = '100'; 

% declare a sample message, corresponds to ABCBA 
msg = [1 1 1 0 1 1 0 0 1 0 1 1 1]; 

%keeps track of the number of matches found, used to add to decodedMsg 
counter = 1; 
% get length of message and use to iterate through the msg 
N = length(msg); 
buffer = []; %must declare buffer if you are to use (end + 1) indexing later on 
for i = 1:N 
    buffer(end + 1) = msg(i);     %add the next msg value to the buffer 
    strBuf = strrep(num2str(buffer),' ',''); %convert buffer into string, e.x. [1 0 1] => '101' 
    findMatch = ismember(code(:,2),strBuf);  %findMatch contains a 1 if a match is found 
    if any(findMatch)       %if any element in findMatch is 1 
     decodedMsg(counter) = code{findMatch,1};%use that element to index a char in code cell array 
     counter = counter + 1;     %increment counter since another code was found 
     buffer = [];       %reset buffer for next string of 1s and 0s 
    end 
end 
Смежные вопросы