在 Matlab 中不使用 for 循环快速生成多个序列的方法

Fast ways to generate multiple sequences without using for loop in Matlab

假设我有两个数组:

startIds = [x1, x2, x3]
endIds = [y1, y2, y3]

两个数组长度相同,可以很长。我们可以假设 (endIds(ii)-startIds(ii)) 对于所有位置 ii 都是相同的。有没有不用for循环快速生成多个序列的方法?

startIds(1):endIds(1)
startIds(2):endIds(2)
startIds(3):endIds(3)

谢谢!

-唐

您可以使用 arrayfun:

sequences = arrayfun(@(i, j) (i:j), startIds, endIds, 'un', 0);

您将得到一个元胞数组 sequences,其中 sequences{k} = startIds(k):endIds(k)

您也可以尝试玩转矩阵,

首先获取startIds中每一个entry和第一个entry的区别,

dif = startIds - startIds(1);
dif_m = repmat(dif,endIds-startIds+1,1);

然后制作第一个序列的矩阵

multi_seq = repmat((startIds(1):endIds(1))',1,length(startIds));

获取序列,

multi_seq = multi_seq + dif_m;

这是我通过 Mathworks 获得的最快答案:

range = endIds(1) - startIds(1);
t3 = bsxfun(@plus, startIds(:), 0:range);

在撰写本文时,这是唯一比我的 for 循环版本更快的版本,而后者又比使用 arrayfun 或 ndgrid 更快。在这里查看我的详细基准: http://www.mathworks.com/matlabcentral/answers/217205-fast-ways-to-generate-multiple-sequences-without-using-for-loop