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

 Akzeptierte Antwort

DGM
DGM am 29 Mär. 2021
Bearbeitet: DGM am 29 Mär. 2021

2 Stimmen

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 Kommentare

Poorva
Poorva am 30 Mär. 2021
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 am 30 Mär. 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 am 30 Mär. 2021
Thank you ....I got it now and the code is working well.
Poorva
Poorva am 30 Mär. 2021
[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)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Steven Lord
Steven Lord am 30 Mär. 2021

1 Stimme

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 Kommentare

DGM
DGM am 30 Mär. 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 am 30 Mär. 2021
thank you steven ....my code is working.

Melden Sie sich an, um zu kommentieren.

Kategorien

Tags

Gefragt:

am 29 Mär. 2021

Kommentiert:

am 30 Mär. 2021

Community Treasure Hunt

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

Start Hunting!

Translated by