MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

# Need a method to arrange data ?

Asked by 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{
}
}
}
}
```

Oleg Komarov on 18 Aug 2012

I don't understand how you go from array a to b.

Jan Simon on 18 Aug 2012

I agree: The relation between a and b is not sufficiently explained.

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.

## Products

Answer by 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 on 19 Aug 2012

Thanks a lot Matt , this is what I was looking for .

Answer by 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 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 .