0

这可能很简单,但这是我的问题。

我有两个向量,开始和结束。起点是连续数字序列的起点,终点是连续数字序列的终点。我想创建一个包含这些运行的向量。

例如,说

starts = [2 7 10 18 24]  
ends = [5 8 15 20 30]

我想创建以下向量

ans = [2 3 4 5 7 8 10 11 12 13 14 15 18 19 20 24 25 26 27 28 29 30]

使用开始:结束只使用每个向量的第一个元素


我也想在不使用 (for) 循环的情况下做到这一点,以尽可能快地保持它!

谢谢阅读

克里斯

4

2 回答 2

2

假设起点和终点的数量始终相同,并且它们始终匹配(例如,第 n 个起点对应于第 n 个终点),那么您可以这样做

cell2mat(arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false))

对于更详细的解释,该arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false)部分将生成一个由 n 个元胞数组组成的序列,其中 n 是startsends向量的长度,使得每个元胞数组具有starts(i):ends(i)对应于两个向量的第 i 个元素的序列。然后该cell2mat函数会将每个单独的单元阵列融合为 1 个更大的矩阵。

于 2013-03-11T23:30:23.453 回答
0

当您担心使其变快时,请预先分配:

starts = [2 7 10 18 24]  
ends = [5 8 15 20 30]
a = zeros(1,sum(ends)+numel(ends)-sum(starts));
% or a = zeros(1,sum(ends+1-starts))
j = 1;
for i = 1:numel(ends)
    j2 = j+ends(i)-starts(i);
    a(j:j2) = (starts(i):ends(i));
    j = j2+1;
end
于 2013-03-11T23:52:31.830 回答