如何在不使用循环的情况下按每个组的结束索引拆分向量?

Vic*_*nov 3 arrays matlab vectorization

假设我有一个特定大小的矢量"toSplit"

我也是一个索引向量,我想分割矢量.例如:

splitInd = [ind1, ind2, ind3]
Run Code Online (Sandbox Code Playgroud)

我的目标是有三个向量:

v1 = toSplit(1:ind1)
v2 = toSplit(ind1+1:ind2)
v3 = toSplit(ind2+1:ind3)
v4 = toSplit(ind3+1:end)
Run Code Online (Sandbox Code Playgroud)

(当然,矢量将成为单元阵列的一部分).在这里运行循环很容易.问题是如何在不运行循环的情况下完成它(我们知道,这不是Matlab喜欢的东西)?

the*_*alk 6

经过一些准备,它的工作是accumarray:

%// example data
data = 1:10;
splitInd = [3, 6, 9];

%// get index array
subs = zeros(size(data));
subs(splitInd+1) = 1;
subs = cumsum(subs) + 1;

%// distributing values into cell array
output = accumarray(subs(:),data(:),[],@(x) {x});
Run Code Online (Sandbox Code Playgroud)

mat2cell 是另一种选择,代码更短,但可能不会更快.

output = mat2cell(data, 1, diff([0 splitInd numel(data)]) )
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这就是我打字的原因! (2认同)