删除MATLAB中的统一列

时间:2016-01-04 18:00:36

标签: matlab matrix

假设我有一个2D矩阵A

A = [   1   1   0   0
        1   0   0   0
        1   1   1   0];

A不一定是二进制,甚至不是整数(即浮点数是可能的)。我想删除任何包含统一值元素的列。在上面的例子中,我会得到:

1   0
0   0
1   1

为了使其完全通用,我想允许用户选择删除行/列/切片的维度(即,使用DIM选项)。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

您可以尝试使用min和max函数,这些函数允许您使用dim参数。

例如

index = min(A,[],1)==max(A,[],1);
A(:,index)=[];

将删除您想要的列。对行

执行相同操作非常简单
index = min(A,[],2)==max(A,[],2);
A(index,:)=[];

答案 1 :(得分:4)

一衬垫:

B = A(:,range(A)~=0);  %//columns

其他单行内容不是那么好,不应该写下难看的单行内容。 :-)但基本上与S ...相同,除了方式更昂贵(需要stats工具箱)。

请注意"一般性"基于下标的解决方案并不容易扩展到N维阵列,因为在ND阵列中预订而不事先检查维度的数量是困难的。此外,对于1D阵列,"均匀性"的概念在单例维度上有点奇怪(结果总是空的)。

答案 2 :(得分:3)

除了@S提供的整洁解决方案之外,还有一个简单的黑客也可以用于你的例子:

echo

ans =

for ii = 1:size(A,2)
    T(ii) = all(A(:,ii) == sum(A(:,ii))/numel(A(:,ii)));
end
A(:,~T)

根据@gariepy的建议,等式的右边可以用 1 0 0 0 1 1 函数替换。

mean

答案 3 :(得分:0)

A(:,~all(A == repmat(A(1,:),[size(A,1) 1])))

受@S ..的启发,但只检查列的每个元素是否等于列的第一个元素。对于处理器而言,似乎比查找最小值和最大值以及检查相等性更少。