我有一个矩阵A
4x10000
,我想用它来查找另一个矩阵C
。
我将通过一个简单的例子简化我的问题:
来自矩阵A
20 4 4 74 20 20
36 1 1 11 36 36
77 1 1 15 77 77
3 4 2 6 7 8
我想首先找到一个中间实体B:
2 3 4 6 7 8
[20 36 77] 0 1 0 0 1 1 3
[4 1 1] 1 0 1 0 0 0 2
[74 11 15] 0 0 0 1 0 0 1
如果第一行的对应值和左边的向量,我们放1,在矩阵A中做一个列。
实体B的最后一列是每行1的总和。
最后我想要一个矩阵C,它由留在实体B中的向量组成,但只有当1的总和大于或等于2时才会出现。
我的例子:
20 4
C = 36 1
77 1
N.B:对于我的问题,我使用矩阵A
4x10000
答案 0 :(得分:2)
看看这是否适合你 -
%// We need to replace this as its not available in your old version of MATLAB:
%// [unqcols,~,col_match] = unique(A(1:end-1,:).','rows','stable') %//'
A1 = A(1:end-1,:).'; %//'
[unqmat_notinorder,row_ind,labels] = unique(A1,'rows');
[tmp_sortedval,ordered_ind] = sort(row_ind);
unqcols = unqmat_notinorder(ordered_ind,:);
[tmp_matches,col_match] = ismember(labels,ordered_ind);
%// OR use - "[tmp2,col_match] = ismember(A1,out,'rows');"
C = unqcols(sum(bsxfun(@eq,col_match,1:max(col_match)),1)>=2,:).'; %//'
%// OR use - "C = out(accumarray(col_match,ones(1,numel(col_match)))>=2,:).'"
答案 1 :(得分:1)
这应该有效:
[a,~,c] = unique(A(1:end-1,:).', 'rows', 'stable');
C=a(histc(c,unique(c))>=2, :).';
编辑:对于旧版本的MATLAB:
D=A(1:end-1,:);
C=unique(D(:,squeeze(sum(all(bsxfun(@eq, D, permute(D, [1 3 2])))))>=2).', 'rows').':