Need a method to arrange data ?

1 view (last 30 days)
Rajan
Rajan on 18 Aug 2012
How can i arrange a array a = [1 2 3 4 3 4 5 3 3 4 2 3 3 4 1 2 3 3 4];
here the numbers 1 ,2 ,...are the order or level in the hierarchy , 1 is top level. 2 is below 1 , 3 is below level 2 and so on.
from first occurence of 1 till next is 1 group of data .
Now i need to arrange array a into array b like this : b =[4 3 5 4 3 3 4 3 2 3 4 3 2 1 3 4 3 2 1];
here tree is like this for data from first 1 till next 1 in array a, i.e.: 1 2 3 4 3 4 5 3 3 4 2 3 3 4
1{
2{
3{
4{
} first 2 elements in array b are 4 ,3 from this part of tree.
}
3{
4{
5{
} next 3 elements in b are 5 ,4, 3 ,and so on..
}
}
3{
}
3{
4{
}
}
}
2{
3{
}
3{
4{
}
}
}
}
  3 Comments
Jan
Jan on 18 Aug 2012
I agree: The relation between a and b is not sufficiently explained.
Rajan
Rajan on 19 Aug 2012
sorry I am not able put this question rightly , I'll try once more a = [1 2 3 4 3 4 5 3 3 4 2 3 3 4 1 2 3 3 4]; let a =[a1 a2]; a1=[1 2 3 4 3 4 5 3 3 4 2 3 3 4]; a2 = [ 1 2 3 3 4] ;
I need b = [b1 b2]; from a1 --> b1 = [4 3 5 4 3 3 4 3 2 3 4 3 2 1]; from a1 --> b2 = [3 4 3 2 1];
To explain relation between a and b , consider a1=[1 2 3 4 3 4 5 3 3 4 2 3 3 4]; I am reading a text file which is as folows: data{
1{
2{
3{
4{
data of level 4;
}
data of 1st level 3; % now b1 = [4 , 3]
}
3{
4{
5{
data of level 5
}
data of level 4
}
data of 2nd level 3; % now b1 = [4 , 3 , 5 , 4 ,3] and soon,
}
3{
data of 3rd level 3;
}
3{
4{
data of level 4;
}
data of 4th level 3;
}
data of level 2 ;
}
2{
3{
data of 1st level 3; %this is first level 3 of second level 2.
}
3{
4{
data of level 4;
}
data of 2nd level 3;
}
data of level 2;
}
data of level 1; }
}%end of data.
Actually array b is the order in which the data of level occurs in the text file.
I hope this time the question is clear.

Sign in to comment.

Accepted Answer

Matt Fig
Matt Fig on 19 Aug 2012
I am sure there is a more efficient way to do this, but I cannot see it right off.
I = find(a==1);
b = [];
for ii = 1:length(I)
if length(I)>=ii+1
A = a(I(ii):I(ii+1));
else
A = [a(I(ii):end) 1];
end
B = [];
D = [1 diff(A)];
cnt = 1;
while any(D<=0)
L = find(D<=0,1,'first');
L2 = L;
X = A(L);
Y = X+1;
while Y>X
Y = A(L-1);
B(cnt) = Y;
cnt = cnt + 1;
L = L-1;
end
A(L:L2-1) = [];
D = [1 diff(A)];
end
b = [b B];
end
b
  1 Comment
Rajan
Rajan on 19 Aug 2012
Thanks a lot Matt , this is what I was looking for .

Sign in to comment.

More Answers (1)

Azzi Abdelmalek
Azzi Abdelmalek on 18 Aug 2012
try this
a = [1 2 3 4 3 4 5 3 3 4 2 3 3 4 1 2 3 3 4];a3=a(3:end);
d=diff(a3);f=find(d<=0);n=length(f);
v=[];k0=1;
for k=1:n
if f(k)>1
v1=a3(k0:f(k))
w=find(or(v1==a(1),v1==a(2)));m=length(w)
if m==1
v=[v v1(1) fliplr(a3(k0+1:f(k)))]
elseif m==2 & f(k)>2
v=[v fliplr(v1(1:2)) fliplr(a3(k0+2:f(k)))]
elseif m==2 & f(k)==2
v=[v fliplr(v1(1:2))]
else
v=[v fliplr(v1)]
end
else
v=[v a3(f(k))]
end
if k<n;k0=f(k)+1,end
end
na3=length(a3);nv=length(v);
if nv<na3
v=[v fliplr(a3(nv+1:end))]
end
v=[v fliplr(a(1:2))]
  1 Comment
Rajan
Rajan on 19 Aug 2012
Hi Azzi , Thanks for this ans , But this is right only when 'a' takes the above values;
If a =[1 1 2 2 3 4 3 3 4];
The above code gives
v = [2 4 3 2 3 4 3 1 1];
but expected value of v is v= [1 2 4 3 3 4 3 2 1];
I think this was my fault because question posted was not clear. Please see the above comment of mine .

Sign in to comment.

Categories

Find more on Programming in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!