如何获取包含1和col2非零的行

时间:2018-01-23 07:52:55

标签: matlab

例如:

x =

 1     0     0
 2     0     0
 1     2     0
 1     2     0
 2     1     0
 3     0     0 

我想获取行:

y =

 1     2     0
 1     2     0
 2     1     0

他们都包含' 1' col2!= 0 。 感谢!!!

2 个答案:

答案 0 :(得分:0)

您可以尝试:

x(any((x == 1 & x(:,2) ~= 0),2),:)

在上面一行:

x == 1

返回logical个索引的矩阵:1对应于x等于1的位置

x(:,2) ~= 0
当第2列中的值与logical不同时,

会返回1数组0

然后

 x == 1 & x(:,2) ~= 0

在满足两个条件时返回logical矩阵1

any((x == 1 & x(:,2) ~= 0),2)
当上述两个条件连续匹配时,

会返回logical数组1

最后,

x(any((x == 1 & x(:,2) ~= 0),2),:)

返回满足所需cnsitions的初始矩阵的行。

答案 1 :(得分:0)

您必须检查每个矩阵行的两个不同条件。这并不意味着你必须使用像for loop之类的迭代方法来做到这一点,因为Matlab在其计算被矢量化时表现更好。

条件1:该行至少包含一个值等于1的列。

使用any function可以轻松实现。您必须使用接受两个参数的重载,因为默认情况下,any会在矩阵的第一个维度(列)上执行计算:

any(x == 1,2) % 2 stands for the second matrix dimension (rows)

这将返回logical向量,其中true值对应于符合指定条件的矩阵行。

条件2:矩阵第二列的行值不得等于0.

这可以使用应用于矩阵第二列的简单不等式运算符来实现,如下所示:

x(:,2) ~= 0

这将返回logical向量,其中true值对应于符合指定条件的行。

最终结果

通过and逻辑运算符(您希望两个条件都为真),结合上面获得的两个索引获得最终行索引:

cond2 = any(x == 1,2) & x(:,2) ~= 0;

这是完整的工作代码,其中使用最终索引选取矩阵行:

x = [
 1     0     0;
 2     0     0;
 1     2     0;
 1     2     0;
 2     1     0;
 3     0     0
];

idx = any(x == 1,2) & x(:,2) ~= 0;
y = x(idx,:);
  

y =

 1     2     0
 1     2     0
 2     1     0