关于其字段MATLAB的排序结构

时间:2015-01-29 12:25:06

标签: matlab sorting structure

我有一个包含位置(-x -y coord。)和点类型信息的结构:

mystr(1).type = 'type2';
mystr(1).location = [5 7]; % [x y] = [5 7]
mystr(2).type = 'type1';
mystr(2).location = [2 8]; % [x y] = [2 8]

我至少有100分。我想先按照-y坐标排序mystr位置,按升序排序第二个-x坐标。最后,我希望mystr(1)显示具有最低位置及其类型的点。另外,我希望mystr(end)显示具有最高位置及其类型的点。

我的代码排序位置如下。

mystr(1).location = [5 7]; mystr(1).type = 'type2';
mystr(2).location = [2 8]; mystr(2).type = 'type1';
mystr(3).location = [3 9]; mystr(3).type = 'type1';
mystr(4).location = [4 2]; mystr(4).type = 'type2';
allpoints = [];
for i = 1:4
    allpoints = [allpoints; mystr(i).location];
end
[~,in] = sort(allpoints(:,2),1,'ascend');
[r,c] = size(allpoints);
allpoints = mat2cell(allpoints,r,2*ones(1));
allpoints = allpoints{1,1}(in,:)
[~,in] = sort(allpoints(:,1),1,'ascend');
[r,c] = size(allpoints);
allpoints = mat2cell(allpoints,r,2*ones(1));
allpoints = allpoints{1,1}(in,:)
for i = 1:4
    mystr(i).location = allpoints(i,:)
end

我不能做类型,但位置将是:

mystr(1).location = [2 8];
mystr(2).location = [3 9];
mystr(3).location = [4 2];
mystr(4).location = [5 7];

PS:如果有人可以缩短分拣部分,我也很高兴。我认为这是不必要的长。提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果要对值进行排序和过滤,则可能需要考虑将值存储在表中。

但是,假设您遇到结构问题,可以采取以下措施:

%# create n-by-2 array with locations
locations = cat(1,mystr.location);

%# sort ascending, so that x are sorted, and within equal x, y are sorted
[~,sortOrder] = sortrows(locations,[1 2]);

%# rearrange the structure
mystrSorted = mystr(sortOrder)

请注意,这假定location永远不会为空;如果可能的话,你需要先用[NaN NaN]替换空,以避免灾难性的混乱。

答案 1 :(得分:2)

这是你的答案:

[~, I] = sortrows(cat(1,mystr(:).location),[2 1]);
mynewstr = mystr(I);

最佳,