在 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
假设我有两个数组:
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