How do I sort a matrix by absolute value and display its original value with +,- sign?

 Réponse acceptée

DGM
DGM le 29 Mar 2021
Modifié(e) : DGM le 29 Mar 2021

2 votes

Consider the case for a vector:
A=randi(19,[10 1])-10
[~,idx]=sort(abs(A))
Asorted=A(idx)
For other arrays, you'll have to decide how exactly you want to sort it, and do the indexing accordingly.

4 commentaires

clc
clear
% generating the table of rows and columns
row = input('Enter number of rows: ');
col = input('Enter number of columns: ');
C = zeros(row ,col);
%taking values from user of matrix
for s = 1:row
for l = 1:col
str = ['Enter element in row ' num2str(s) ', col ' num2str(l) ': '];
C(s,l) = input(str);
end
end
%taking absolute values of all elements
D=abs(C);
%sorting the rows in descending order
[T,I]=sort(D,2,'descend');
This is my code. Please help me with this, Matrix C has the original input from user in +,- sign, D has the absolute value of C, T gives the sorted matrix but all in + sign ,but I want the sorted result with both +,- sign as the input given by user.
e.g C= [ 1 -8
-4 7]
D=[ 1 8
4 7]
T=[8 1
7 4]
i want the result as res= [-8 1
7 -4]
DGM
DGM le 30 Mar 2021
If you want to sort descending on dim2, my method becomes more cumbersome because of how the index array is organized as row vector indices instead of array indices.
% you could do this without a loop
% but this is less obfuscated
[T,idx]=sort(abs(C),2,'descend');
for r=1:row % because we're sorting on dim2
T(r,:)=C(r,idx(r,:));
end
T
If you're using a sufficiently recent version, you can just use Steven's suggestion from his answer, which is much more concise.
T=sort(C,2,'descend','comparisonmethod','abs')
For your purposes these two methods are probably both fine, but they do handle duplicate values differently.
Poorva
Poorva le 30 Mar 2021
Thank you ....I got it now and the code is working well.
[y, idx2] = sort(D,2,'descend');
sx = size(C);
index = sub2ind(sx, repmat((1:sx(1)).', 1, sx(2)), idx2);
y2 = C(index);
res=array2table(y2)

Connectez-vous pour commenter.

Plus de réponses (1)

Specify the 'ComparisonMethod' name-value pair argument.
rng default
A = randi([-10 10], 5, 5)
A = 5×5
7 -8 -7 -8 3 9 -5 10 -2 -10 -8 1 10 9 7 9 10 0 6 9 3 10 6 10 4
[values, locations] = sort(A(:), 'ComparisonMethod', 'abs');
[values.'; locations.']
ans = 2×25
0 1 -2 3 3 4 -5 6 6 7 7 -7 -8 -8 -8 9 9 9 9 10 10 10 10 10 -10 14 8 17 5 21 25 7 15 19 1 23 11 3 6 16 2 4 18 24 9 10 12 13 20 22

2 commentaires

DGM
DGM le 30 Mar 2021
Do you know about when that option was introduced? I'm guessing it was some time around 2018, but release notes are vague and I only know it's not in R2015b.
Poorva
Poorva le 30 Mar 2021
thank you steven ....my code is working.

Connectez-vous pour commenter.

Catégories

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by