关于其字段 MATLAB 的排序结构
sort structure with respect to its field MATLAB
我有一个包含点的位置(-x -y 坐标)和类型信息的结构:
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: 如果有人能缩短排序部分,我也很高兴。我认为它不必要地长。提前致谢。
如果您想对值进行排序和过滤,那么您可能需要考虑将值存储在 table 中。
但是,假设您受困于某个结构,您可以执行以下操作:
%# 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]
替换 empty 以避免灾难性的混乱。
这是你的答案:
[~, I] = sortrows(cat(1,mystr(:).location),[2 1]);
mynewstr = mystr(I);
最佳,
我有一个包含点的位置(-x -y 坐标)和类型信息的结构:
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: 如果有人能缩短排序部分,我也很高兴。我认为它不必要地长。提前致谢。
如果您想对值进行排序和过滤,那么您可能需要考虑将值存储在 table 中。
但是,假设您受困于某个结构,您可以执行以下操作:
%# 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]
替换 empty 以避免灾难性的混乱。
这是你的答案:
[~, I] = sortrows(cat(1,mystr(:).location),[2 1]);
mynewstr = mystr(I);
最佳,