2013-11-25 5 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의 길이를 미리 할당 할 가정하면, 직접 X의 요소에 문자를 할당 할 수

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

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

당신이 배열의 모든 요소와 1을 대체 할 수있는 곳.

이 과제는이 사전 할당 된 배열에서 현재 위치를 추적해야한다는 것입니다. 이미 1, 2 및 3의 위치에 문자를 쓴 경우 다음 과제는 x : x(4) = ...의 네 번째 요소에 쓰게된다는 것을 알아야합니다.

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

이 미리 정의 된 문자 배열 x의 끝에 문자 A을 추가

더 우아한 솔루션은 다음이 될 수 있습니다. x 길이를 미리 할당 할 필요는 없습니다.

+0

두 번째 코드 단편은 x의 길이가 0이면 오류를 반환합니다. >> x (끝) = 2 x (0)에 액세스하려고 시도했습니다. index는 양의 정수 또는 논리 여야합니다. 미리 할당되어 있고 길이가 0이 아닌 경우에도 x의 마지막 요소는 계속 덮어 쓰여질 것입니다. 맞습니까? 디코딩 수행 방법에 따라 카운터 변수를 업데이트하거나 for 루프에서 반복 변수를 사용해야합니다. – Falimond

+0

오류가 발생했습니다. 내 프로그램은 코드의 각 비트를 하나씩 검사합니다. 코드 워드가 code = [1 0 1 1 1]이면 A = [1 1], B = [1 0 1] 및 C = [1 0 0]이라고 가정하십시오.), 여기서 n = 1입니다. 코드 (n) == 1이면 코드 (n + 1) == 0인지 확인합니다. 그러면 true 인 경우 코드 (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 
관련 문제