Matlab:我如何在矩阵A上进行这种转换?

时间:2014-11-02 21:11:16

标签: matlab matrix

我有一个矩阵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

2 个答案:

答案 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').':