这可能很简单,但这是我的问题。
我有两个向量,开始和结束。开始是连续数字序列的起点,结束是连续数字序列的终点。我想创建一个包含这些运行的向量。
例如,说
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]
使用start:end仅使用每个向量的第一个元素
我还想在不使用(for)循环的情况下这样做,以尽可能快地保持它!
感谢您阅读
克里斯
答案 0 :(得分:2)
假设始终有相同数量的起点和终点,并且它们总是匹配(例如第n个起点对应于第n个结束点),那么你可以做
cell2mat(arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false))
对于更详细的解释,arrayfun(@(s,e) (s:e), starts, ends, 'UniformOutput', false)
部分将生成n个单元阵列的序列,其中n是starts
和ends
向量的长度,这样每个单元格数组具有对应于两个向量的第i个元素的序列starts(i):ends(i)
。然后cell2mat
函数将每个单独的单元阵列融合成1个更大的矩阵。
答案 1 :(得分: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