在Matlab中对坐标矩阵进行排序

时间:2014-04-13 21:54:59

标签: matlab sorting matrix

Matlab 中,我有一个包含许多点(超过200000)的坐标(x,y,z)的大矩阵。有一个额外的列用作标识。我编写了这段代码,以便对所有坐标点进行排序。我的最终目标是找到重复的点(具有相同x,y,z的行)。排序坐标点后我使用diff函数,具有相同坐标的矩阵的两个连续行将取值[0 0 0],然后使用ismember我可以找到该矩阵的哪些行应用" diff"有[0 0 0]行。使用从ismember返回的索引,我可以找到重复的点。

回到我的问题......这是我编写的代码,用于正确排序我的coordintes + id矩阵。我想它可以做得更好。有什么建议吗?

 %coordinates are always positive
 a=[ 1 2 8 4; %sample matrix
     1 0 5 6;
     2 4 7 1;
     3 2 1 0;
     2 3 5 0;
     3 1 2 8;
     1 2 4 8];
b=a; %for checking purposes

%sorting first column
a=sortrows(a,1);

%sorting second column
for i=0:max(a(:,1));

    k=find(a(:,1)==i);
    if not(isempty(k))
        a(k,:)=sortrows(a(k,:),2);
    end
end

%Sorting third column
for i=0:max(a(:,2));  
    k=find(a(:,2)==i);
    if not(isempty(k))
    %identifying rows with same value on first column
        for j=1:length(k)
            [rows,~] = ismember(a(:,1:2), [ a(k(j),1),i],'rows');
            a(rows,3:end)=sortrows(a(rows,3:end),1); 
        end
    end
end 

%Checking that rows remain the same
m=ismember(b,a,'rows');

if length(m)~=sum(m)
    disp('Error while sorting!');
end

2 个答案:

答案 0 :(得分:1)

为什么不使用unique

[uniqueRows, ii, jj] = unique(a(:,1:3),'rows');

示例

a = [1     2     3     5
     3     2     3     6
     1     2     3     9
     2     2     2     8];

给出

uniqueRows =

     1     2     3
     2     2     2
     3     2     3

jj =

     1
     3
     1
     2

意思是第三行等于第一行。

如果您需要完整的唯一行,包括第四列:使用ii索引a

fullUniqueRows = a(ii,:);

给出了

fullUniqueRows =

     1     2     3     9
     2     2     2     8
     3     2     3     6

答案 1 :(得分:0)

尝试根据第四列对a进行排序?这样做 -

a=[ 1 2 8 4; %sample matrix
    1 0 5 6;
    2 4 7 1;
    3 2 1 0;
    2 3 5 0;
    3 2 1 8;
    1 2 4 8];

[x,y] = sort(a(:,4))
sorted_a=a(y,:)

尝试获取具有重复x-y-z坐标的行索引由前三列表示?这样做 -

out = sum(squeeze(all(bsxfun(@eq,a(:,1:3),permute(a(:,1:3),[3 2 1])),2)),2)>1

并对sorted_a使用它。