* 아래 링크에서 계층 구조 cell로 되어 있는 경우

http://zacurr.tistory.com/544 


* 비계층 구조 cell data access에 비해 훨씬 직관적임


1. cell array 저장

 

data= cell(1,3);

data{1} = cell(10,1); % 계층 구조로 cell 생성

data{2} = cell(10,1);

data{3} = cell(10,1);


중략


save('data_file.mat','data');


2. cell array 로드


load('data_file.mat')

(data라는 이름으로 로드 됨)


3. cell column copy


data 는 1x3 cell 내부에 10x1 cell 이 3개 있음



이 중 2번째 column을 다른 변수로 저장하고 싶을 경우


a=data{2};   (a는 data의 2번째 column이 저장된 10x1 cell)


* cell이 아닌 array로 저장하고 싶을 경우

a=cell2mat(data{2}); % 10x1 array


4. cell column sum


sum_value = sum([a{:}]);

혹은

sum_value=sum(cell2mat(a))


column의 값들이 모두 더해짐


5. string txt 파일을 cell로 읽기


fp=fopen('test.txt','r');

data = textscan(fp,'%s'); % string일 경우 , 숫자일 경우는 그냥 a=load('test.txt');

data = data{:}; % 이걸 안해주면 data=1x1 cell이고 안으로 들어가야 다시 string 내용이 존재

                      % 이걸 해주면 바로 data에 접근 가능

fclose(fp);


6. cell data에 접근


a{n} => 내용물에 바로 접근

a(n) => cell 형태로 return -> 다시 data access 필요


7. cell data sorting 하기


ex) 숫자로 된 2번째 column을 내림차순으로 sorting 하는 경우

[p, idx] = sort(cell2mat(data{2}),'descend')

혹은

[p, idx] = sort(cell2mat(a),'descend')


8. sorting 후 상위 n개 data만 선택하여 cell 로 저장


n = 3;

data2 = data{2}(idx(1:n)); 혹은 data2 = a(idx(1:n));  % 한 column만 복사


전체 column을 복사하기

data2 = {data{1}(idx(1:n)) data{2}(idx(1:n)) data{3}(idx(1:n))}

* 이 경우는 비계층 cell이 더 편함


8. cell data를 cell에 복사


a(1:3) = data{1}(1:3)


9. 숫자 array data를 cell에 복사


*num2cell을 이용

a(1:3) = num2cell([1 2 3]);



10. cell 각각의 원소에 값 복사

data{1}{1} = 1;

data{1}{2} = 'D:\images.jpg';

data{1}{3} = sum(score(1:3)) > 0;


11. logic 연산


* cell data 중 10보다 큰지 작은지 여부를 알고 싶을때 (binary로 return)

* cell2mat을 이용


score = cell2mat(data{2}) >= 5


* textscan으로 

  data= textscan(fp,'%s\t%s\t%f'); 이러한 형태로 읽을 경우

data{3} 은 %f 형태로 읽었기 때문에, cell이 아니라 double array로 저장됨

이 같은 경우에는 check = data{3} >=5 와 같이 직관적으로 사용 가능



12. 계층 구조 cell -> 비계층 구조 cell로 변환
 
 data2=[data{:,1} data{:,2} data{:,3}]

 * 계층 구조 cell 중에 위의 textscan으로 읽은 것과 같이 cell이 아닌 double, int 등 숫자 array가 포함된 경우
   => num2cell을 사용해서 cell 형태로 변환 후 처리

  data의 3번째 원소가 cell이 아닌 숫자 array라 가정
  data2=[data{:,1} data{:,2} num2cell(data{:,3})]

  숫자 array가 여러개 포함된  경우 : 2~끝열까지 숫자라 가정
data = [data{:,1} num2cell([data{:,2:end}])];




Posted by 우주여행가
,