在 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
答案 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
使用它。