How to replace elements in an array with the indices of the array's sorted, unique values?

12 次查看(过去 30 天)
This is what I have (below). I am wondering if there is a better way of accomplishing the aforementioned task. Also, is there a name for this process? I don't have a formal computer science education so I'm curious.
A = randi(9,5,2); % Initialize matrix.
uA = unique(A); % Unique values of A.
B = A; % Output.
for idx = 1:length(uA) % Index to unique values, replace with
B(B == uA(idx)) = idx; % their sorted indices.
end

采纳的回答

Stephen23
Stephen23 2017-10-23
编辑:Stephen23 2017-10-23
All you need is the third output of unique followed by reshape:
>> [~,~,Y] = unique(A);
>> reshape(Y,size(A))
For example:
>> B % from running your code
B =
4 5
2 3
1 4
4 7
5 6
>> [~,~,Y] = unique(A);
>> reshape(Y,size(A))
ans =
4 5
2 3
1 4
4 7
5 6

更多回答(2 个)

Walter Roberson
Walter Roberson 2017-10-23
That code is wrong: you are changing B "in place" and comparing against all of it, so you could end up changing the same location multiple times. For example, suppose one of the unique values was 1/2 and another was 1, and those got index values 1 and 2 respectively. You change the 1/2 entries to 1. But that creates a 1 that is then there to be matched against uA(2) so you would mistake the 1 that was the index with the 1 that was the value.
You should just use
[uA, B] = unique(A);

Steven Lord
Steven Lord 2017-10-23
Do you want the ic third output from unique, or a version of that output that you've used reshape on to make it the same shape as A?

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by