Arrays 如何在不使用循环的情况下按每组的结束索引拆分向量?
假设我有一个特定大小的向量“toSplit” 我还需要一个索引向量,我想拆分这个向量。例如:Arrays 如何在不使用循环的情况下按每组的结束索引拆分向量?,arrays,matlab,vectorization,Arrays,Matlab,Vectorization,假设我有一个特定大小的向量“toSplit” 我还需要一个索引向量,我想拆分这个向量。例如: splitInd = [ind1, ind2, ind3] 我的目标是有三个向量: v1 = toSplit(1:ind1) v2 = toSplit(ind1+1:ind2) v3 = toSplit(ind2+1:ind3) v4 = toSplit(ind3+1:end) (当然,向量将成为单元数组的一部分)。在这里运行循环很容易。问题是我如何在不运行循环的情况下完成它(我们知道,这不是Mat
splitInd = [ind1, ind2, ind3]
我的目标是有三个向量:
v1 = toSplit(1:ind1)
v2 = toSplit(ind1+1:ind2)
v3 = toSplit(ind2+1:ind3)
v4 = toSplit(ind3+1:end)
(当然,向量将成为单元数组的一部分)。在这里运行循环很容易。问题是我如何在不运行循环的情况下完成它(我们知道,这不是Matlab喜欢的东西)?经过一些准备,这是一项工作:
是另一种选择,代码更短,但可能不会更快
output = mat2cell(data, 1, diff([0 splitInd numel(data)]) )
在更短的
splitInd
向量上循环也是合理的:
splitInd = [1, splitInd, numel(toSplit)]
for split = 1:numel(splitInd)-1
splits{split} = toSplit(splitInd(split):splitInd(split+1));
end
如今,MATLAB中的循环确实没有那么低效,在这种情况下,你甚至不需要在整个
toSplit
向量上循环。我们知道,这不是MATLAB喜欢的东西
,这不是绝对的。首先创建功能代码,然后再考虑优化。而且,作为记录,mat2cell
使用了一个for
循环。“真正的问题是程序员花了太多时间在错误的地方和错误的时间担心效率;过早优化是万恶之源(或者至少是大部分)在编程方面。”——@excaza:我不知道,谢谢你提供的信息。然后的循环与mat2cell
一样好。删除了我最初使用mat2cell
的建议。正如循环的<代码>已经被理解,它是这里最好的选择。@丹尼尔,我不认为这是一个坏建议,它使语法干净,并且应该已经内置了良好的错误检查。只是指出循环本身并不坏。这就是我要输入的!
splitInd = [1, splitInd, numel(toSplit)]
for split = 1:numel(splitInd)-1
splits{split} = toSplit(splitInd(split):splitInd(split+1));
end