【问题标题】:Get all vector elements between different indices获取不同索引之间的所有向量元素
【发布时间】:2014-08-07 09:51:39
【问题描述】:

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

开始=[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]

有什么想法吗?

【问题讨论】:

  • 恐怕我不能完全理解你的问题。您的“开始”和“结束”向量究竟如何代表起点/终点? 'A' 和 'A_Result' 之间的关系是什么?
  • @McMa 如果我对他的理解正确,他想将所有A(idx) 从向量1 中的start 复制到他的结果中,直到1 在向量end 中。至少这与他的结果相符。
  • 看起来你做到了;)
  • 顺便说一句,请避免将变量命名为 Matlab 保留字,例如 startend

标签: matlab vector


【解决方案1】:

无循环:

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]

【讨论】:

  • 非常好的解决方案,您也可以使用mask==1 而不是find(mask) 不确定哪个更快/更好。无论如何+1
  • 我认为mask==1 不会返回像 1 2 3 这样的索引...因此我使用了find(),但确实可能有比 find 更快的方法。
  • 确实如此,因为如果该行为真,它会检查每个元素。您必须使用Result=A(mask==1);,如果我的计时测试正确,那将是最快的。
【解决方案2】:

查看 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多