Sort function does not return correct indices

8 vues (au cours des 30 derniers jours)
IO
IO le 24 Nov 2019
Commenté : IO le 24 Nov 2019
I am using the sort function to sort values in each row of a large matrix. The function returns the correct sorted matrix, but not always the correct indices.
The row highlighted in the screenshot below provides an example (columns 1-3 are the original matrix, columns 4-6 are the sorted matrix, and columns 7-9 are the indices). In row 870, the sorted values are in the correct order, but the indices are in the opposite order. Notice the function gives the correct answer for all other lines in this example.
What am I doing wrong?
[Usort,Uind]=sort(U,2,'descend');
Check=[U,Usort,Uind];
Sorting.png
  2 commentaires
dpb
dpb le 24 Nov 2019
Modifié(e) : dpb le 24 Nov 2019
We can't tell w/o data what generated the table...I've never observed such a problem...
Attach the raw dataset...
Which release are you using just on the most rarest of chances that a bug somehow did get introduced?
ADDENDUM: Actually 870 is NOT wrong...see Answer. I'm guessing you're looking for sorting by decreasing absolute value, not magnitude.
IO
IO le 24 Nov 2019
Modifié(e) : IO le 24 Nov 2019
It is based on simulated data. Below is the whole code that generates these outputs.
There are a few rows where the sort function generates the wrong indices (eg 870, 884).
I am using Matlab R2016b.
% Create grid of households
n=100; % number of grid points on each dimension (latitute and longitude)
v=(1:1:n)'; % temporary vector
lonh=kron(ones(n,1),v); % longitude of households
lath=kron(v,ones(n,1)); % latitude of households
clear v;
% School characteristics
m=3; % number of schools
lons=[20,40,65]'; % longitude of schools
lats=[25,50,75]'; % latitude of schools
quality=[50,80,60]; % quality of schools
capacity=[3000,4000,3000]; % capacity of schools
% Create matrix of distances
dist=zeros(n^2,m); % storage matrix for distance
for i=1:m
dist(:,i)=sqrt((lath-lats(i)).^2+(lonh-lons(i)).^2);
end
% Create matrix of utilities
alpha=1; % coefficient on quality in household utility function
rng(1);
error=evrnd(0,1,[n^2,m]); % draws of error terms in utility function of households (extreme value type one)
U=-dist+alpha*repmat(quality,[n^2,1])+error; % matrix of utilities
% Create 'truthfull' ordered lists of schools
[Usort,Uind]=sort(U,2,'descend'); % ordered lists of schools for each household
Check=[U,Usort,Uind];

Connectez-vous pour commenter.

Réponse acceptée

dpb
dpb le 24 Nov 2019
Modifié(e) : dpb le 24 Nov 2019
870 is not wrong... -7.2 (1) < -6.2 (3)
neither is 884.
884 -15.89 18.31 -10.21 18.31 -10.21 -15.89 2 3 1
-15.89 (1) < -10.21 (3) < 18.31 (2)
Maybe you're thinking in terms of abs() magnitude, not values?
  1 commentaire
IO
IO le 24 Nov 2019
Got it. Thanks a lot, and sorry for the trouble!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Shifting and Sorting Matrices dans Help Center et File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by