0

私は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)

これは (長さ,値) です。たとえば (0,6) です。これは、0 がなく、値が 6 であるためです。最初の 0 に出会うと、0 が 1 つあり、値が-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

私はこれが実行されないことを知っています!しかし、それは私がこれまで管理してきたことです

4

2 に答える 2

0

このような複雑なループを実行する代わりに、次の方法でループなしですべてを実行できます。

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

出力を 2 行にしましたが、 で 1 行のベクトルを取得できますrelmat(:).'。rlcを取得する簡単な方法だと思います。

説明:最初に、ゼロ以外のすべての値のマスクを作成し、 に格納しrlc_mます。次に、トリックは次のとおりです。ゼロ以外の値(2行目)は、最初の値をマスクする入力の要素です。2 つの数値の間の 0 の数を取得するには、入力配列内のゼロ以外の要素のインデックスの差から 1 を引いて、2 つのインデックス間の要素の数を厳密にカウントします。

于 2014-12-04T10:40:15.497 に答える