sorting 3d matrix by value of a cell

3 visualizzazioni (ultimi 30 giorni)
Markus
Markus il 14 Nov 2011
hei,
i have a 3d matrix, where each layer into the 3rd dimension is a new measurement. the value in one cell however gives me the distance. now i would like to sort these layer by this cell (distance).
this is possible within a 2d matrix with the function 'sortrows'.
thanks for help ;-) markus

Risposta accettata

Laura Proctor
Laura Proctor il 14 Nov 2011
From what I understand, you just want to sort by an element on each page in the 3D array - this is how you can do it:
A = randi(10,[4,4,4])
[~,idx] = sort(A,3); % sort by the page
iv = zeros(1,size(A,3)); % set up the indexing vector
iv(:) = idx(1,1,:); % find the ordering of the (1,1)
% element by which to sort A
B = A(:,:,iv) % sort A according to the (1,1)
% element of each page
  2 Commenti
Markus
Markus il 14 Nov 2011
hei laura,
thanks for your answer. if i read your code right, you sorted the pages by cell (1,1,:) which is the same position in A and idx.
;-) markus
Laura Proctor
Laura Proctor il 14 Nov 2011
You got it!

Accedi per commentare.

Più risposte (1)

Sven
Sven il 14 Nov 2011
Hi Markus,
If you have a 3D MATRIX of numbers, and the distance you want to sort by is stored, say, in the (1,1) location of each slice in the third dimension, try:
A = rand(5,5,10);
[~,sortOrder] = sort(A(1,1,:),3);
A_sorted = A(:,:,sortOrder);
If you have a 3D CELL of numbers, read below:
Unfortunately when passing a cell to sort(), it expects that cell to be a cell of strings. The only way to sort numeric data in a cell is to convert it to a matrix, as below:
Let's first make your data into a cell (I'm only including "distance"... I presume since your data is in a cell to start with then there's a good reason you didn't store it as a vector of distances):
distanceCell = num2cell(rand(1,1,20))
We then just make a vector from only the numeric values in the cell
distancesVector = cat(1,distanceCell{1,1,:});
Then we sort that vector and reorder the cell accordingly.
[~, sortOrder] = sort(distancesVector);
sortedCell = distanceCell(:,:,sortOrder);
  3 Commenti
Markus
Markus il 14 Nov 2011
aehm, i also accept your answer .. :) but i read laura first.
Sven
Sven il 14 Nov 2011
Aha, no problems Markus

Accedi per commentare.

Categorie

Scopri di più su Shifting and Sorting Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by