在Matlab中保留单元格的唯一行而不考虑顺序

时间:2016-08-17 11:57:48

标签: matlab unique

我在Matlab中有一个mx4单元格A

对于每个j = 1,...,m,

A{j,1}2x2矩阵。

对于每个j = 1,...,m,

A{j,2}2x2矩阵。

对于每个j = 1,...,m,

A{j,3}2x2矩阵。

对于每个j = 1,...,m,

A{j,4}1x2矩阵。

E.g。何时m=4

A{1,1}=[0 -1; 1 1]
A{1,2}=[1 0; 2 1]
A{1,3}=[2 0; 3 1]
A{1,4}=[3 0]

A{2,1}=[0 5; 1 1]
A{2,2}=[1 0; 2 1]
A{2,3}=[2 4; 3 1]
A{2,4}=[1 0]

A{3,1}=[2 0; 3 1]
A{3,2}=[1 0; 2 1]
A{3,3}=[0 -1; 1 1]
A{3,4}=[3 0]

A{4,1}=[3 1; 2 0]
A{4,2}=[2 1; 1 0]
A{4,3}=[0 -1; 1 1]
A{4,4}=[3 0]

我想要一个保持唯一序列A{j,1} A{j,2} A{j,3} A{j,4}

的算法

(1)没有区别 在序列之间具有相同的4个组件但顺序不同

(2)区分具有相同4个组件的序列,直到每个组件中行向量的重新排序

例如,关于上面的单元格A,算法应保留

A{1,1}=[0 -1; 1 1]
A{1,2}=[1 0; 2 1]
A{1,3}=[2 0; 3 1]
A{1,4}=[3 0]

A{2,1}=[0 5; 1 1]
A{2,2}=[1 0; 2 1]
A{2,3}=[2 4; 3 1]
A{2,4}=[1 0]

A{4,1}=[3 1; 2 0]
A{4,2}=[2 1; 1 0]
A{4,3}=[0 -1; 1 1]
A{4,4}=[3 0]

1 个答案:

答案 0 :(得分:0)

你可以试试这个

solutionvector=true(size(A(:,1))); %assue all a different

[~,b,c]=unique(cell2mat(A(:,4)),'rows');%find which {j,4} are the same

for i=1:max(c) %go throuth each unique A{j,4}
    if sum(c==i)>1 %if there is more than one entry
       for j=1:sum(c==i)-1 %for the amount of equal entries minus the last
           entries=find(c==i); %get the indicies of the following entries
            for k=j+1:sum(c==i) %compare the following entries with j
                if( any(arrayfun(@(x) isequal(A(entries(j),1),x),A(entries(k),1:3))) && ...
                    any(arrayfun(@(x) isequal(A(entries(j),2),x),A(entries(k),1:3))) && ...
                    any(arrayfun(@(x) isequal(A(entries(j),3),x),A(entries(k),1:3)))) %check if each of the A{j,1:3} is in A(k,1:3)
                        solutionvector(entries(k))=false; %delete it in the solution vector and
                        c(entries(k))=0; %delete it from the check list
                end
            end    
       end
    end %end if c==i>1
end

B=A(solutionvector,:);%only get the cells hat are left

如果工作正常,请检查更大的样本