我有一个起点向量(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]
任何想法?
答案 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