如何在MATLAB中用零分割矢量

时间:2014-11-22 10:59:52

标签: matlab vector split

我有一个用零分割矢量的问题。

我有一个矢量例如

  

v = [1 3 2 6 4 0 0 2 4 6 0 0 0 3 1]

我需要得到像

这样的载体
  

v1 = [1 3 2 6 4]

     

v2 = [2 4 6]

     

v3 = [3 1]

使用MATLAB函数有没有办法做到这一点?

当然,我不知道主矢量 v 中包含多少个子矢量以及有多少个零分隔矢量。

我不是程序员,也不是MATLAB的专业人士。 我知道这样做的程序方法,但是想要以某种方式通过MATLAB来做。

我找到了一个函数A = strsplit(str,delimiter)但是我没有字符串我有一个向量。 所以我搜索了转换功能。我发现S = char(V)但是当我执行它时它崩溃了。

2 个答案:

答案 0 :(得分:3)

将输出作为单元格数组更好,而不是单独的变量。这样输出将更容易处理。

试试这个:

v = [1 3 2 6 4 0 0 2 4 6 0 0 0 3 1]; %// data
w = [false v~=0 false]; %// "close" v with zeros, and transform to logical
starts = find(w(2:end) & ~w(1:end-1)); %// find starts of runs of non-zeros
ends = find(~w(2:end) & w(1:end-1))-1; %// find ends of runs of non-zeros
result = arrayfun(@(s,e) v(s:e), starts, ends, 'uniformout', false); %// build result

结果(例如):

>> result{:}
ans =
     1     3     2     6     4
ans =
     2     4     6
ans =
     3     1

答案 1 :(得分:2)

整个数字小于9的向量的strsplit()解决方案(因此,对于一般解决方案,请参见Luis Mendo's),这是一个非常具体的解决方案。拆分并转换回数字:

res = strsplit(char(v), char(0));
res = cellfun(@(x) x - 0,res,'un',0);

celldisp(res)
res{1} =
     1     3     2     6     4
res{2} =
     2     4     6
res{3} =
     3     1