【问题标题】:Matlab: changing zero-one index vector to proper index vectorMatlab:将零一索引向量更改为适当的索引向量
【发布时间】:2013-12-16 12:35:30
【问题描述】:

假设下面的二进制索引向量

输入

1 1 0 0 1 0 1

1 2 3 4 5 6 7

预期输出

1 2 5 7

表示要选择的nth 数字。所以我想把1 1 0 0 1 0 1改成1 2 5 7,有什么简单的方法吗?

【问题讨论】:

  • 我之前做过vals=1:length(dataStructure); vals(indicesBinary),但正在寻找更优雅的解决方案。

标签: matlab indices


【解决方案1】:

解决方法是使用函数find(indicesBinary)

【讨论】:

  • Ofc,为什么我总是忘记这个...+1。
  • :)。请记住,如果你想用它来索引另一个向量,使用 find 作为中间步骤实际上比直接使用 indicesBinary 慢
  • 你的意思是vals=1:length(dataStructure); vals(logical(indicesBinary))更好?
  • 一点也不。如果您想这样做,查找会更有效。但是如果你想使用 vals 或 indiciesBinary 从不同的向量中选择值,直接使用 indiciesBinary 会更快。
  • 假设你有一些向量 v = [13,63,34,1]; 并且你有一个二进制索引向量 b_idx = [0, 1, 1, 0]; 如果你想用 b_idx 索引 v,你可以使用 sel_v = v(b_idx);。输出为 sel_v = [63,34] 并且速度快+。如果您想知道 b_idx 对应的索引(如问题中所述),请执行idx = find(b_idx);。输出为 idx = [2,3]。然后,您当然也可以使用sel_v = v(idx); 来获得 sel_v = [63,34]。执行find,然后使用idx 进行索引以获取[63,34] 也很快,但不如直接使用b_idx 快。希望能解决问题
【解决方案2】:

如果你真的想使用你的输出来索引另一个向量,直接做。

您只需将二进制向量转换为logical

A = [1 1 0 0 1 0 1];    %assuming its double
B = [1 2 3 4 5 6 7];

C = B( logical(A) )

C =

     1     2     5     7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多