如果我有一个类似的矩阵:
400 450 450 300
450 300 450 340
450 200 300 210
300 100 300 200
200 200 100 100
475 300 225 300
删除所有不包含特定范围之间数字的列的最佳方法是什么 - 例如400-500 - 至少两次或更多。在此示例中,将删除列B和D,因为B仅包含此范围内的数字一次,而D在此范围内不包含任何内容。
所需的输出是:
400 450
450 450
450 300
300 300
200 100
475 225
我尝试使用IF语句扫描每个列并将匹配移动到新矩阵中,但这似乎效率低下。
答案 0 :(得分:1)
假设A
是输入矩阵,您可以使用此矩阵索引方法 -
A(:,sum(A>=400 & A<=450,1)>=2)
这对你的问题来说必须是一种非常有效的方法。
sum(A>=400 & A<=450,1)>=2
为我们提供了满足我们需求的逻辑列数组,然后我们使用它来索引A
列。
注意:如果要删除的列数与列总数相比是一个非常小的数字,您可以直接删除它们而不是索引到匹配的列中,以便在特殊情况下采用更有效的方法。所以,在这种情况下你可以这样做 -
A(:,sum(A>=400 & A<=450,1)<2)=[];