例如:
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 。 感谢!!!
答案 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