sie*_*gel 5 matlab run-length-encoding
我有一个矩阵1s,并-1s用随机穿插0s:
%// create matrix of 1s and -1s
hypwayt = randn(10,5);
hypwayt(hypwayt > 0) = 1;
hypwayt(hypwayt < 0) = -1;
%// create numz random indices at which to insert 0s (pairs of indices may
%// repeat, so final number of inserted zeros may be < numz)
numz = 15;
a = 1;
b = 10;
r = round((b-a).*rand(numz,1) + a);
s = round((5-1).*rand(numz,1) + a);
for nx = 1:numz
hypwayt(r(nx),s(nx)) = 0
end
Run Code Online (Sandbox Code Playgroud)
输入:
hypwayt =
-1 1 1 1 1
1 -1 1 1 1
1 -1 1 0 0
-1 1 0 -1 1
1 -1 0 0 0
-1 1 -1 -1 -1
1 1 0 1 -1
0 1 -1 1 -1
-1 0 1 1 0
1 -1 0 -1 -1
Run Code Online (Sandbox Code Playgroud)
我想计算nonzero一列中重复元素的次数,以产生这样的东西:
基本思路是(由@rayryeng提供)对于每一列,每次你点击一个唯一的数字,你开始递增一个累积的运行计数器,并且每次你达到与前一个相同的数字时它会递增.一旦你点击一个新的数字,它就会被重置为1,除了你点击0的情况,所以它是0
预期产出:
hypwayt_runs =
1 1 1 1 1
1 1 2 2 2
2 2 3 0 0
1 1 0 1 1
1 1 0 0 0
1 1 1 1 1
1 2 0 1 2
0 3 1 2 3
1 0 1 3 0
1 1 0 1 1
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最简洁方法是什么?
我想应该有更好的方法,但这应该有效
使用cumsum,diff,accumarray&bsxfun
%// doing the 'diff' along default dim to get the adjacent equality
out = [ones(1,size(A,2));diff(A)];
%// Putting all other elements other than zero to 1
out(find(out)) = 1;
%// getting all the indexes of 0 elements
ind = find(out == 0);
%// doing 'diff' on indices to find adjacent indices
out1 = [0;diff(ind)];
%// Putting all those elements which are 1 to zero and rest to 1
out1 = 0.*(out1 == 1) + out1 ~= 1;
%// counting each unique group's number of elements
out1 = accumarray(cumsum(out1),1);
%// Creating a mask for next operation
mask = bsxfun(@le, (1:max(out1)).',out1.');
%// Doing colon operation from 2 to maxsize
out1 = bsxfun(@times,mask,(2:size(mask,1)+1).'); %'
%// Assign the values from the out1 to corresponding indices of out
out(ind) = out1(mask);
%// finally replace all elements of A which were zero to zero
out(A==0) = 0
Run Code Online (Sandbox Code Playgroud)
结果:
输入:
>> A
A =
-1 1 1 1 1
1 -1 1 1 1
1 -1 1 0 0
-1 1 0 -1 1
1 -1 0 0 0
-1 1 -1 -1 -1
1 1 0 1 -1
0 1 -1 1 -1
-1 0 1 1 0
1 -1 0 -1 -1
Run Code Online (Sandbox Code Playgroud)
输出:
>> out
out =
1 1 1 1 1
1 1 2 2 2
2 2 3 0 0
1 1 0 1 1
1 1 0 0 0
1 1 1 1 1
1 2 0 1 2
0 3 1 2 3
1 0 1 3 0
1 1 0 1 1
Run Code Online (Sandbox Code Playgroud)