【问题标题】:Run Length Coding Matlab运行长度编码 Matlab
【发布时间】:2014-12-03 14:05:55
【问题描述】:

我正在 Matlab 中进行运行长度编码,到目前为止,我已经实现了 zigzag 算法并得到了一个数组 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

我知道这不会运行!但这就是我到目前为止所做的事情

【问题讨论】:

  • 前三对不应该是 (0,6) (0,-1) (0,-1) 吗?
  • 你说得对,我安排好了 :)

标签: matlab run-length-encoding


【解决方案1】:

这应该可以解决问题:

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(63);索引超出范围,因为 numel(RunLengthCoding)=62。和 CodeR 中的错​​误(第 68 行),而 RunLengthCoding(i)==0 % 只要我们遇到零就会继续运行
  • 现在我在前一行代码中遇到错误,即 CodeR 中的错​​误(第 54 行)a = cell2mat(blocks(i,j));
  • 我的数组以 0 结尾,但如果算法找不到 > 0 的值,则该算法不应写入任何内容,即我需要 (0,0),因为我的数组以 0 结尾,如问题
  • 我已经编辑了我的答案,因此当您的原始数组以 0 结尾时,您现在将 (0,0) 作为最后一个条目。
  • 谢谢 :) 但是,算法无法正常工作,我得到了很多值,例如 0 4 0 6 0 6 0 -24 0 -10 1 -5 0 5 等(看起来已经不太好了)
【解决方案2】:

你可以不用任何循环来做整个事情,而不是做这样一个复杂的循环,方式如下:

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

我已将输出分为两行,但您可以使用relmat(:).' 获得单行向量。我认为这是获得 rlc 的一种更简单的方法。

解释:首先我创建所有非零值的掩码,存储到rlc_m。然后诀窍如下:非零值(第 2 行)是输入的元素,我在其中屏蔽了第一个元素。为了获取两个数字之间的 0 的个数,我计算输入数组中非零元素的索引差,减去 1 来严格计算两个索引之间的元素个数。

【讨论】:

  • 我试过了,但我收到一个错误:使用 vertcat 时出错 被连接的矩阵的尺寸不一致。 CodeR 中的错​​误(第 79 行)relmat = [diff(find(rlc_m))-1 ;
猜你喜欢
  • 2012-08-17
  • 2013-02-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多