如何在MATLAB中将矢量分割为n个不同的部分?

时间:2014-05-17 05:07:06

标签: matlab vector

我有一个向量i,如下所示:

i = 
[1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603]

我想把它分成两个向量,如下所示:

v1 = 
[1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645]

v2 =
[10585
10586
10587
10588
10589
10590
10591
10592
10593
10594
10595
10596
10597
10598
10599
10600
10601
10602
10603]

到目前为止,我已经使用了如下的独特功能:

[b,m,n] = unique(diff(i));

m给出了关键点的索引如下:

m = sort(m)+1;

m =
[20
38]

结合m值,这是我用来手动实现目标的片段:

v1 = i(1:m(1)-1)

v2 = i(m(1):m(2))

因此,总而言之,我希望从一个大的向量中获得n个不同的向量,基于n以不同的值返回,以更高效和直接的方式返回。为超长的帖子道歉。

4 个答案:

答案 0 :(得分:1)

这样做的方法与每个集合中的元素数量无关,并且集合的数量为:

a = [1:4, 10:14, 45:47];
ind = [0 find(diff([a, inf])~=1)];
b = arrayfun(@(n) a(ind(n)+1:ind(n+1)), 1:numel(ind)-1, 'UniformOutput', 0);

b{:}
ans =
     1     2     3     4

ans =
    10    11    12    13    14

ans =
    45    46    47

现在b{1} = [1 2 3 4]b{2} = [10 11 12 13 14]b{3} = [45 46 47]

arrayfun行在这种情况下等同于:

for n = 1:numel(ind)-1
   b{n} = a(ind(n)+1 : ind(n+1));
end

现在可以执行以下操作:但是,我会建议您将其保留为单元格

v1 = b{1};
v2 = b{2};

答案 1 :(得分:1)

现在你已经更好地解释了这个问题(在评论中):Stewie Griffin's answer做你想要的。或者您可以避免arrayfun并在一行中执行此操作:

v = mat2cell(i, diff([0 find(diff(i)>1).' numel(i)]));

答案 2 :(得分:0)

n个向量似乎具有相同的长度。那应该做的工作(未经测试)

n_elem_per_vector = find(diff(i) > 1, 1);
n_vector = numel(i) / n_elem_per_vector;
reshaped_i = reshape(i, n_elem_per_vector, n_vector);

答案 3 :(得分:0)

2012年,Loren的MATLAB博客艺术here讨论了这个问题。

其中一位评论者(Ed)提供了一个很好的解决方案:

out = mat2cell(a,1,accumarray(1+cumsum([0,diff(a)~=1])',ones(size(a))'));