我正在使用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)
这是(长度,值),例如(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 :(得分: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
答案 1 :(得分:0)
不是做这么复杂的循环,而是可以通过以下方式完成整个过程而不需要任何循环:
% 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以严格计算两个索引之间的元素数量。