这可能不是最易读或最优雅的方式,但如果你有大向量并且速度是一个问题,这种向量化可能会有所帮助......
A = [1 2 1 1 3 2 4 4 1 1 1 2];
首先,我要用前导零和尾随零填充 A 以捕获第一个和最后一个转换
>> A = [0, A, 0];
可以找到相邻值之间的差异不等于 0 的过渡位置:
>> locations = find(diff(A)~=0);
但是因为我们用零填充了 A 的开头,所以第一个转换是无意义的,所以我们只取 2:end 的位置。其中A中的值是每个段的值:
>> first_column = A(locations(2:end))
ans =
1 2 1 3 2 4 1 2
这是第一个列 - 现在查找每个数字的计数。这可以从位置的不同中看出。这是在两端填充 A 变得重要的地方:
>> second_column = diff(locations)
ans =
1 1 2 1 1 2 3 1
最后结合:
B = [first_column', second_column']
B =
1 1
2 1
1 2
3 1
2 1
4 2
1 3
2 1
这一切都可以组合成一个可读性较差的行:
>> A = [1 2 1 1 3 2 4 4 1 1 1 2]';
>> B = [A(find(diff([A; 0]) ~= 0)), diff(find(diff([0; A; 0])))]
B =
1 1
2 1
1 2
3 1
2 1
4 2
1 3
2 1