【发布时间】:2016-03-06 15:24:39
【问题描述】:
如果我有一个向量:
[4,5,6,7,11,12,13,14,21,22,23]
没有循环,我如何提取所有连续数字块的开始/结束值,即上述向量的期望结果将是一个 2 列向量:
b =
4 7
11 14
21 23
【问题讨论】:
如果我有一个向量:
[4,5,6,7,11,12,13,14,21,22,23]
没有循环,我如何提取所有连续数字块的开始/结束值,即上述向量的期望结果将是一个 2 列向量:
b =
4 7
11 14
21 23
【问题讨论】:
另一种方法:
x = [4,5,6,7,11,12,13,14,21,22,23];
x = x(:);
ind = find([1; diff(x)-1; 1]);
result = [x(ind(1:end-1)) x(ind(2:end)-1)];
【讨论】:
find(schedule),我可以得到您正在使用的格式。而不是开始+结束,我需要开始+长度,我通过resultFinal = [result(:,1), result(:,2) - result(:,1) + 1] 获得。非常优雅的代码,省去了for 循环,速度大约是原来的两倍!
简单:
a = [4,5,6,7,11,12,13,14,21,22,23];
b = reshape(a(sort([find(a - circshift(a,[0,1]) ~= 1),find(a - circshift(a,[0,-1]) ~= -1)])),2,[])'
输出:
b =
4 7
11 14
21 23
【讨论】:
b = reshape(a(sort([find(a - circshift(a,[0,1]) ~= 1),find(a - circshift(a,[0,-1]) ~= -1)])),[],2)
a = [2,5,6,7,11,12,13,14,21,22,23]; 我得到b 等于[2 11;2 14;5 21;7 23],这似乎是不正确的
[2 2; 5 7; 11 14; 21 23]
像这样:
v = [4,5,6,7,11,12,13,14,21,22,23];
dv = diff(diff(v)==1);
bv = find(dv==+1)+1;
if dv(1) == 0
bv = [1,bv];
end;
ev = find(dv==-1)+1;
if dv(end) == 0
ev = [ev,numel(v)];
end;
b = v([bv(:),ev(:)]);
【讨论】:
v = [2,5,6,7,11,12,13,14,21,22,23]; 这似乎错过了第一个元素
不是最佳答案,但我花了一个小时才得到它,所以我想发布它:
x = (0:10:a(end))'; %'
subindex = @(A) [A(1) A(end)];
fun = @(q) subindex( a(a>q & a<q+10));
res = cell2mat(arrayfun(fun, x, 'UniformOutput', false));
它适用于任何大小的a。
【讨论】: