Matlab中如何按指定切片长度拆分向量(求单行代码)
解决Matlab按指定长度拆分向量且无需细胞数组的问题
嘿,我懂你现在卡在哪了——要把向量按给定长度拆成切片,但不想用细胞数组来存。针对你给的例子,我给你几个实用的方案:
方案1:生成独立的切片变量
如果希望每个切片都是单独的变量,结合cumsum(累积求和)和deal函数就能搞定,甚至能写成比较简洁的形式:
首先先算出每个切片的起始和结束索引:
a = 1:119; slices = [47 24 1 47]; idx_bound = [0, cumsum(slices)]; % 从0开始的边界索引,方便计算每个切片的范围
然后用deal把每个切片直接赋值给独立变量:
[slice1, slice2, slice3, slice4] = deal(a(idx_bound(1)+1:idx_bound(2)), ... a(idx_bound(2)+1:idx_bound(3)), ... a(idx_bound(3)+1:idx_bound(4)), ... a(idx_bound(4)+1:idx_bound(5)));
要是slices的长度是动态变化的(比如不一定是4个切片),可以用循环批量创建变量(虽然Matlab一般不推荐动态变量名,但如果是刚需的话完全可行):
for i = 1:length(slices) assignin('base', ['slice', num2str(i)], a(idx_bound(i)+1:idx_bound(i+1))); end
运行后,工作区就会出现slice1到sliceN(N是slices的长度)这些变量,正好对应你要的各个切片。
方案2:用结构体存储(更整洁的非细胞数组选择)
如果不想搞一堆零散变量,结构体是个很好的替代,代码也很清爽:
a = 1:119; slices = [47 24 1 47]; idx = cumsum([1, slices]); % 先生成临时细胞数组再转结构体,避免直接用细胞数组存储结果 temp_cells = arrayfun(@(i) a(idx(i):idx(i+1)-1), 1:length(slices), 'UniformOutput', false); slice_struct = cell2struct(temp_cells, compose('slice%d', 1:length(slices)), 1);
之后你就可以通过slice_struct.slice1、slice_struct.slice2来访问各个切片,结构清晰,也满足了不用细胞数组的要求。
单行代码小技巧(针对固定长度切片)
要是你就想写单行代码,针对你这个特定例子可以直接写:
slice1=a(1:47); slice2=a(48:71); slice3=a(72); slice4=a(73:119);
当然这只适用于切片长度固定的情况,通用场景还是前面的方案更靠谱。
最后提醒一句:一定要保证slices的总和等于向量a的长度,不然会出现索引越界的错误哦!
内容的提问来源于stack exchange,提问作者user2305193
相关产品推荐
相关产品推荐

