Matlab: How I can make this transformation on the

2019-08-05 10:03发布

I have a matrix A 4x10000, I want to use it to find another matrix C.

I'll simplify my problem with a simple example:

from a matrix 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  

I want, first, to find an intermediate entity 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

we put 1 if the corresponding value of the first line and the vector on the left, made ​​a column in the matrix A.

the last column of the entity B is the sum of 1 of each line.

at the end I want a matrix C, consisting of vectors which are left in the entity B, but only if the sum of 1 is greater than or equal to 2.

for my example:

     20  4
C =  36  1
     77  1

N.B: for my problem, I use a matrix A 4x10000

标签: matlab matrix
2条回答
爷、活的狠高调
2楼-- · 2019-08-05 10:22

This should work:

[a,~,c] = unique(A(1:end-1,:).', 'rows', 'stable');
C=a(histc(c,unique(c))>=2, :).';

Edit: For older versions of MATLAB:

D=A(1:end-1,:);
C=unique(D(:,squeeze(sum(all(bsxfun(@eq, D, permute(D, [1 3 2])))))>=2).', 'rows').':
查看更多
女痞
3楼-- · 2019-08-05 10:33

See if this works for you -

%// 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,:).'"
查看更多
登录 后发表回答