2d arry sorting

7 ビュー (過去 30 日間)
Sahan Priyanga
Sahan Priyanga 2015 年 11 月 18 日
コメント済み: Sahan Priyanga 2015 年 11 月 19 日
i have 2d array which consist of
  1. ). 1st row for y axis coordinate of point(i)
  2. ). 2nd row for x axis coordinate of point(i)
  3. ). ilet consider following
a(1,:)=[1,2,3,4,10,11,12,13,19,20,21,22];
a(2,:)=[4,1,3,2,4,3,1,2,3,2,4,1];
a(3,:)=[1,2,3,4,5,6,7,8,9,10,11,12];
according to the above array 'a' it shows that it is shorted according to the first column(according to y coordinates).
but in my case i want to sort them with following steps
  • identify the position where the difference between two consecutive values of y coordinates (values of a(a,:)) changes rapidly and
  • sort the values between those rapidly change with respect to x coordination (a(2,:))
let consider the following
a =
1 2 3 4 10 11 12 13 19 20 21 22
4 1 3 2 4 3 1 2 3 2 4 1
1 2 3 4 5 6 7 8 9 10 11 12
0 1 1 1 6 1 1 1 6 1 1 1
here 4th row represent the difference between two consecutive y coordinates (a(1,:))
in there 5th value shows rapid change so i want consider first 4 value set and analyze the x and y coordinates w.r.t x coordinate (a(2,:))
in same way for whole array and following array represented the expected results.
a =
2 4 3 1 12 13 11 10 22 20 19 21
1 2 3 4 1 2 3 4 1 2 3 4
1 2 3 4 5 6 7 8 9 10 11 12
0 1 1 1 6 1 1 1 6 1 1 1
note by:
the 3rd column value should not be changed.
the rapid changed is not obtained in same period like in above it varying.(in my case it happened after every 4 values )
the rapid change is not 6 for every instant (let the solution should convenience for values greater than 3)
  • can any one help me to code this*
  1 件のコメント
Sahan Priyanga
Sahan Priyanga 2015 年 11 月 19 日
thanks for your quick response, it is worked correctly.
but i'm stuck in following situation. I have think i can manage it but it is really difficult to manage in the case when those are stored in structured cell array.
in my case both x and y coordinates are in 'Centroid' field and many other columns/field also there(s.t. boundingbox,fixelvalue which are related to certain images).
the simply meaning is that when sorting i want to move they also without changing their original position.

サインインしてコメントする。

採用された回答

Renato Agurto
Renato Agurto 2015 年 11 月 18 日
編集済み: Renato Agurto 2015 年 11 月 18 日
Hi,
is this what you want?
Cheers!
Renato
clear
a(1,:)=[1,2,3,4,10,11,12,13,19,20,21,22];
a(2,:)=[4,1,3,2,4,3,1,2,3,2,4,1];
a(3,:)=[1,2,3,4,5,6,7,8,9,10,11,12];
N = size(a,2);
%Create 4th row
a(4,1) = 0;
a(4,2:end) = a(1,2:end) - a(1,1:end-1);
delta = 3;
i1 = 1;
for i = 1:N
%find range to sort i1:i2
if i == N || a(4,i+1) > delta
i2 = i;
%extract the part of the 2d-array to be sorted
tmp_a = a(1:2,i1:i2);
[~, I] = sort(tmp_a(2,:));
%put it back in the 2d-array
a(1:2,i1:i2) = tmp_a(1:2, I);
i1 = i+1;
end
end

その他の回答 (1 件)

Guillaume
Guillaume 2015 年 11 月 18 日
Here's how I'd do it:
a = [1 2 3 4 10 11 12 13 19 20 21 22
4 1 3 2 4 3 1 2 3 2 4 1
1 2 3 4 5 6 7 8 9 10 11 12];
splitlength = diff([0 find(diff(a(1, :)) >= 3) size(a,2)]); %find distance between rapid changes
splita = mat2cell(a([1 2], :), 2, splitlength); %split 1st two rows of into sub matrices
sortedsplita = cellfun(@(m) sortrows(m', 2)', splita, 'UniformOutput', false); %sort submatrices by second row
sorteda = [cell2mat(sortedsplita); a(3, :)] %recombine submatrices and 3rd row of a
Vectorised code, so should be fast.

カテゴリ

Help Center および File ExchangeShifting and Sorting Matrices についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by