簡體   English   中英

游程編碼Matlab

[英]Run Length Coding Matlab

我正在Matlab中進行游程長度編碼,到目前為止,我已經實現了之字形算法並獲得了數組RunLengthCoding:

RunLengthCoding = 
(32, 6, -1, -1, 0, -1, 0, 0, 0, -1, 0, 0, 1, 0, 0,..., 0)

現在我需要運行長度代碼,這樣我得到:

(0,6) (0,-1) (0,-1) (1,-1) (3,-1) (2,1) (0,0)

這是(length,value),例如(0,6),因為沒有0,而我們的值是6,那么當我們遇到第一個0時,我們得到(1,-1),因為那里有一個0,並且值之后是-1。

我的嘗試:

RunLengthCoding(1)=[]; %to remove first DC component
relMat = [];
N = 0;
for i = 1:length(RunLengthCoding)-1
     if RunLengthCoding(i)==0;
          if RunLengthCoding(i)==RunLengthCoding(i+1)
               N = N + 1;
          else
              valuecode = RunLengthCoding(i);
              lengthcode =  N;
              relMat = [relMat;  lengthcode valuecode];
              N = 1;
          end
        else
           relMat=[relMat; 0 RunLength(i)];  
    end

我知道這不會運行! 但這是我到目前為止所做的

這應該可以解決問題:

RunLengthCoding = [77   -6  -11 -18 -6  -6  2   -1  4   -1  -1  6   3   1   -1  0   0   0   2   1   2   -1  -1  0   -1  1   0   0   0   0   0   0   -1  0   0   1   0   0   0   0   0   0   0 0 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0];

RunLengthCoding(1)=[]; %to remove first DC component
relMat = [];

i = 0;
while i < length(RunLengthCoding)
    i=i+1;
    N = 0;
    while (RunLengthCoding(i)==0 && i < length(RunLengthCoding)) % keep going as long as we encounter zeros
        N=N+1;
        i=i+1;
    end
    relMat = [relMat N RunLengthCoding(i)]; % output the number of zeros we have encountered and the next value
end

if relMat(end)==0
    relMat(end-1)=0;
end

不必進行如此復雜的循環,您可以按以下方式完成整個過程而無需任何循環:

% RunLengthCoding is the input row vector
rlc_m = (RunLengthCoding~=0);
relmat = [diff(find(rlc_m))-1 ; RunLengthCoding([false,rlc_m(2:end)])];

我將輸出分為兩行,但您可以使用relmat(:).'獲得單個行向量relmat(:).' 我認為這是獲取rlc的一種更簡單的方法。

說明:首先,我創建所有非零值的掩碼,並將rlc_m存儲到rlc_m 然后,訣竅如下:非零值(第二行)是輸入的元素,其中我屏蔽了第一個值。 為了獲取兩個數字之間的0,我計算輸入數組中非零元素的索引差,減去1來嚴格計算兩個索引之間的元素數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM