How to sort the matrix rows based on a function over the rows
Mostra commenti meno recenti
Let's say I have a Nx3 matrix M of double.
Consider, for example, a function Map(a,b,c) that returns a double
How can I sort M so that the rows with smallest Map come first?
For example, the first row should be i if Map(M(i,1), M(i,2), M(i,3)) value is the smallest between Map(M(j,1), M(j,2), M(j,3)) for any 1 ≤ j ≤ N and j ≠ i
Risposte (2)
Jos (10584)
il 13 Dic 2017
I have no clue what a,b and c are but I assume the function Map(a,b,c) will return a vector of N elements:
X = Map(a,b,c)
[sortX, idx] = sort(X) % sort X, retrieve the sorting indices
sortedM = M(idx,:) % sort M accordingly
6 Commenti
Daniel Tex
il 13 Dic 2017
Modificato: Daniel Tex
il 13 Dic 2017
Jos (10584)
il 13 Dic 2017
Does Map allow vectors?
X = Map(M(:,1),M(:,2),M(:,3))
if not:
X = arrayfun(@(r) Map(M(r,1),M(r,2), M(r,3)), 1:size(M,1))
Daniel Tex
il 13 Dic 2017
Modificato: Daniel Tex
il 13 Dic 2017
Jos (10584)
il 13 Dic 2017
Did you try to run the arrayfun line on your matrix M as above? What does it return?
Retrieving the indices of a sort and use it to re-order another array is a classic trick ...
Daniel Tex
il 13 Dic 2017
Modificato: Daniel Tex
il 13 Dic 2017
Jos (10584)
il 14 Dic 2017
so, then it should work ... or am I missing something?
Andrei Bobrov
il 14 Dic 2017
[~ii] = = sort(arrayfun(@(r) Map(M(r,:)), 1:size(M,1)));
out = M(ii,:);
Categorie
Scopri di più su Shifting and Sorting Matrices in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!