【问题标题】:Finding all rows in a pair of vectors where both entries are non-zero (Octave)查找一对向量中的所有行,其中两个条目均非零(八度音阶)
【发布时间】:2013-02-25 14:31:14
【问题描述】:

我在 Octave 中有一个 n x 2 矩阵,我想找到 matrix(row, 1) 和 matrix(row, 2) 元素不为零的每一行。我可以使用这样的 for 循环:

[nrows, ncols] = size(data);
for i = 1:nrows
    if(data(i, 1) ~= 0 && data(i, 2) ~= 0)
        % Do something
    end
end

问题在于 n 大约是 300 万,而 Octave 中的迭代需要永远。我觉得有一种方法可以用 find 来做到这一点,但我还没有弄清楚。

有人有什么建议吗?

谢谢!

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

    您可以创建使用逻辑索引:

    idx = all(data(:,1:2)~=0, 2);
    

    生成的向量idx 在每行都包含1s,其中两个单元格都非零,否则0。

    【讨论】:

    • 然后使用find(idx)获取这些元素的索引。
    • @FabianTamp:这完全取决于 OP 想要对他的数据做些什么。有许多操作不需要索引,并且由于 find 的计算成本很高(与省略它相比),我总是会尽量避免它并坚持使用逻辑索引。
    • 公平通话。我认为@anjruu 在问题中提到find 可能值得一提:)
    【解决方案2】:

    我认为在这种情况下(因为它与零值有关)以下也应该起作用

    idx=(data(:,1).*data(:,2)~=0)

    但@H.Muster 的解决方案适用于所有情况,因此更好。

    【讨论】:

      【解决方案3】:

      如果性能是问题:也许尝试将两列都转换为逻辑:

      useful = and(logical(data(:,1)),logical(data(:,2)))
      

      然后你可以再次使用逻辑索引:

      filtered = data(useful,:)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        • 2015-06-28
        • 1970-01-01
        • 2021-04-23
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        相关资源
        最近更新 更多