Need a method to arrange data ?

Asked by Rajan on 18 Aug 2012
Latest activity Commented on by Rajan on 19 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

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.

Rajan

Products

2 Answers

Answer by Matt Fig on 19 Aug 2012
Accepted answer

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 .

Matt Fig
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 .

Azzi Abdelmalek

Contact us