【问题标题】:How to split vector by zeros in MATLAB如何在MATLAB中将向量除以零
【发布时间】:2014-11-23 04:38:53
【问题描述】:

我遇到了用零分割向量的问题。

例如,我有一个向量

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) 但是当我执行它时它崩溃了。

【问题讨论】:

  • 崩溃了你的意思是你有一个错误?请发布错误

标签: matlab vector split


【解决方案1】:

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

试试这个:

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

【讨论】:

  • 比@oleg-komarov 的答案更好,因为这是一般性的,Oleg 仅适用于整数 1-9,不适用于 10 及以上且不适用于浮点值
【解决方案2】:

strsplit() 解决方案是针对小于 9 的 整数 数的向量(因此是一个非常具体的解决方案,有关通用解决方案,请参阅 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

【讨论】:

  • 您必须小心,这仅适用于整数向量。浮点条目将被截断为整数。
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 2013-01-28
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2016-11-21
相关资源
最近更新 更多