Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matlab: sorting a matrix in a unique way

I have a problem with sorting some finance data based on firmnumbers. So given is a matrix that looks like:

[1 3 4 7;
1 2 7 8;
2 3 7 8;]

On Matlab i would like the matrix to be sorted as follows:

[1 0 3 4 7 0;
1 2 0 0 7 8;
0 2 3 0 7 8;]

So basically every column needs to consist of 1 type of number.

I have tried many things but i cant get the matrix sorted properly.

like image 861
user3864684 Avatar asked Dec 25 '22 06:12

user3864684


1 Answers

A = [1 3 4 7;
     1 2 7 8;
     2 3 7 8;]

%// Get a unique list of numbers in the order that you want them to appear as the new columns
U = unique(A(:))'

%'//For each column (of your output, same as columns of U), find which rows have that number. Do this by making A 3D so that bsxfun compares each element with each element
temp1 = bsxfun(@eq,permute(A,[1,3,2]),U)    

%// Consolidate this into a boolean matrix with the right dimensions and 1 where you'll have a number in your final answer
temp2 = any(temp1,3)

%// Finally multiply each line with U
bsxfun(@times, temp2, U)

So you can do that all in one line but I broke it up to make it easier to understand. I suggest you run each line and look at the output to see how it works. It might seem complicated but it's worthwhile getting to understand bsxfun as it's a really useful function. The first use which also uses permute is a bit more tricky so I suggest you first make sure you understand that last line and then work backwards.

like image 177
Dan Avatar answered Jan 01 '23 14:01

Dan