假设我有一个2D矩阵A
:
A = [ 1 1 0 0
1 0 0 0
1 1 1 0];
A
不一定是二进制,甚至不是整数(即浮点数是可能的)。我想删除任何包含统一值元素的列。在上面的例子中,我会得到:
1 0
0 0
1 1
为了使其完全通用,我想允许用户选择删除行/列/切片的维度(即,使用DIM
选项)。
有什么想法吗?
答案 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 ..的启发,但只检查列的每个元素是否等于列的第一个元素。对于处理器而言,似乎比查找最小值和最大值以及检查相等性更少。