获取不同索引之间的所有向量元素

时间:2014-08-07 09:51:40

标签: matlab vector

我有一个起点向量(start)和另一个终点向量(end):

  

start = [1 0 0 0 1 0 0 0 1 0 0 0]
  结束= [0 0 1 0 0 0 1 0 0 0 1 0]

我想要第三个向量A每个开始和终点之间的所有数字。

  

A = [1 2 3 4 5 6 7 8 9 1 2 3]

所以此示例的结果可能如下所示:

  

A_result = [1 2 3 5 6 7 9 1 2]

任何想法?

2 个答案:

答案 0 :(得分:4)

没有循环:

s=[1 0 0 0 1 0 0 0 1 0 0 0];
e=[0 0 1 0 0 0 1 0 0 0 1 0];
mask = cumsum(s)-cumsum([shift(e,1)])
# Will be  [1   1   1   0   1   1   1   0   1   1   1   0]

A = [1 2 3 4 5 6 7 8 9 1 2 3];
A(find(mask))
# will be  [1   2   3   5   6   7   9   1   2]

或者 The Minion 指出,只需:

A(mask==1)
# will be  [1   2   3   5   6   7   9   1   2]

答案 1 :(得分:0)

从seb检查解决方案对大型阵列来说更快。

这是使用for-loop

的解决方案
d_start=[1 0 0 0 1 0 0 0 1 0 0 0];
d_end= [0 0 1 0 0 0 1 0 0 0 1 0];
A = [1 2 3 4 5 6 7 8 9 1 2 3];

starting_idx = find(d_start);
ending_idx = find(d_end);

A_result = [];
for l=1:numel(starting_idx)
    A_result=horzcat(A_result, A(starting_idx(l):ending_idx(l)));
end

我正在做的是:1。我得到起点和终点的索引(find)。然后我预定义了我的结果。现在我只需要循环起始点中的条目数,并将那些位置的值添加到我的结果的下一个结尾。

编辑:时间测试: 我使用了我的解决方案以及seb的解决方案(修改为我的变量名称):

mask = cumsum(d_start)-cumsum([0 d_end(1:end-1)]);
B_res =A(find(mask));

以及我对他的解决方案的评论:

mask = cumsum(d_start)-cumsum([0 d_end(1:end-1)]);
B_res =A(mask==1);

这些是A:[12888x1]double

的时间结果
t_forloop : 33 sec
t_seb_find: 0.31 sec
t_seb_logical: 0.1964 sec