【问题标题】:How do i remove matrix rows based on 3 different criteria?如何根据 3 个不同的标准删除矩阵行?
【发布时间】:2017-05-16 19:41:38
【问题描述】:

假设我有一个包含整数和非整数的 23x3 矩阵。理想情况下,我希望根据以下标准删除一些矩阵行:

  • 如果任何 2 列是非整数,则删除行
  • 如果所有 3 列都是非整数,则删除行
  • 如果所有列都是整数,则删除行

上面的意思是剩下的行应该只有one non-integertwo integers

下面是我的矩阵:

    A = [1  1.5 1
         1  2.5 1
         1  3.5 1
         1  1   1.5
         1  1.5 1.5
         1  2   1.5
         1  2.5 1.5
         1  3   1.5
         1  3.5 1.5
         1  4   1.5
         1  1.5 2
         1  2.5 2
         1  3.5 2
         1  1   2.5
         1  1.5 2.5
         1  2   2.5
         1  2.5 2.5
         1  3   2.5
         1  3.5 2.5
         1  4   2.5
         1  1.5 3
         1  2.5 3
         1  3.5 3];

我的最终输出应该是:

B = [1  1.5 1  
     1  2.5 1
     1  3.5 1
     1  1   1.5
     1  2   1.5
     1  3   1.5
     1  4   1.5
     1  1.5 2
     1  2.5 2
     1  3.5 2
     1  1   2.5
     1  2   2.5
     1  3   2.5
     1  4   2.5
     1  1.5 3
     1  2.5 3
     1  3.5 3];

我仍在学习,仍在努力寻找自己的脚步。请各位大神帮我解决这个问题。谢谢!

【问题讨论】:

标签: matlab matrix vector


【解决方案1】:

您的三个标准与一个标准相同:

  • 只保留恰好包含 1 个非整数的行

从你昨天的(非常相似的)问题中汲取灵感,可以使用

B = A;
B(sum(mod(B,1)~=0, 2)~=1, :) = [];

这会检查previous question 中看到的非整数,然后对行求和以查找仅通过一个元素的行。删除所有其他行。


如果您真的想将其实现为 3 个条件,则可以将它们(按照您编写它们的顺序)作为逻辑“或”语句来完成,由管道 | 分隔:

B = A;
B(sum(mod(B,1)~=0, 2)==2 | sum(mod(B,1)~=0, 2)==3 | sum(mod(B,1)==0, 2)==3, :) = [];

【讨论】:

  • OP 可能不想覆盖A,不过,更改为B=A(sum(mod(A,1)~=0,2)==1,:); 很简单。
  • @JacobD 我只是在模仿 OP 从链接问题中接受的答案。我错过了首先将B 分配为输出矩阵的答案,我已经相应地编辑了我的答案。
  • 感谢@Wolfie 并感谢大家。我还想问的一件事(我知道我可能应该问一个新问题,但如果需要,我可以更新这个问题)是如何从B 获取17x1 matrix,其中count of the rows of B 编号为1-17。请有什么想法我可以尝试吗?再次感谢!
  • @User1772 你的意思是A的行号列表符合你的条件(在B中可以看到)?
  • 不!抱歉,它只是 B 中的行号列表。这与 A 无关。我只想计算 B 中的行。我需要这个计数来在我的代码中的某个点提取任何行的 x、y、z 坐标。很抱歉混淆了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多