Art*_*Art 7 arrays matlab grouping matrix
我有很大的阵容.为简单起见,我们将其简化为:
A = [1 1 1 1 2 2 3 3 3 3 4 4 5 5 5 5 5 5 5 5];
Run Code Online (Sandbox Code Playgroud)
因此,有一组1(4个元素),2个(2个元素),3个(4个元素),4个(2个元素)和5个(8个元素).现在,我想只保留属于3个或更多元素组的列.所以它会像:
B = [1 1 1 1 3 3 3 3 5 5 5 5 5 5 5 5];
Run Code Online (Sandbox Code Playgroud)
我正在使用for循环,分别扫描1个,2个,3个等等,但它对于大阵列非常慢...感谢任何建议如何以更有效的方式做到:)艺术.
如果您的向量不一定要排序,那么您需要运行以计算向量中每个元素的出现次数.你histc只是为了这个:
elem = unique(A);
counts = histc(A, elem);
B = A;
B(ismember(A, elem(counts < 3))) = []
Run Code Online (Sandbox Code Playgroud)
最后一行选择少于3次出现的元素并删除它们.
如果您的向量是"半排序的",即如果向量中的相似元素组合在一起(如您的示例中所示),则可以通过执行以下操作来加快速度:
start_idx = find(diff([0, A]))
counts = diff([start_idx, numel(A) + 1]);
B = A;
B(ismember(A, A(start_idx(counts < 3)))) = []
Run Code Online (Sandbox Code Playgroud)
再次注意,矢量不需要完全排序,只是相似的元素彼此相邻.
这是我的双线
counts = accumarray(A', 1);
B = A(ismember(A, find(counts>=3)));
Run Code Online (Sandbox Code Playgroud)
accumarray用于计算A的个体成员.找到符合"3个或更多元素"标准的成员.最后,ismember告诉你他们在A的位置.注意A不需要排序.当然,accumarray仅适用于A中的整数值.