2012-12-29 3 views
1

나는 정확히 똑같은 두 변수를 가지고 있지만, 하나는 <double>이고 다른 하나는 <cell>입니다. 코드에서 그들은 cell2mat에 의해 변환 된 것으로 보인다. 나는 이것이 데이터 저장 장치의 문제라는 것을 이해하지만 이것에 대해서는 celldouble의 차이점과 정의를 볼 수 없다.셀에 저장된 데이터와 MATLAB에서 double로 저장된 데이터의 차이점은 무엇입니까?

+0

답변이 좋을 때 - 배열에서 모든 항목이 같은 유형이어야합니다. 셀에서는 여러 유형이 될 수 있습니다 (Excel 표와 같음 - 숫자와 텍스트가 혼합되어 있음).). – bdecaf

답변

4

배열 및 셀 배열은 일반적으로 MATLAB에서 가장 일반적으로 사용되는 두 가지 데이터 유형입니다.

1D 및 2D 배열은 수학과 마찬가지로 선형 대수학의 행렬입니다. 그러나 배열은 다차원 (n 차원) 배열 (텐서라고도 함) 일 수도 있습니다. MATLAB은이 배열을 다차원 배열이라고 부릅니다. 또한 MATLAB은 스칼라와 배열을 구분하지 않으며 벡터와 다른 행렬을 구분하지 않습니다. 스칼라는 MATLAB의 1x1 배열이며 벡터는 MATLAB의 Nx1 및 1xN 배열입니다.

몇 가지 예 : class 명령에 의해보고 된

MyScalar = 1; 
MyHorizVector = [ 1 2 3 ]; 
MyVertVector = [ 1 2 3 ]'; 
MyMatrix = [ 1, 2; 3, 4 ]; 
My4Darray = cat(4, [ 1 2; 3 4], [ 5 6; 7 8 ], [ 9 10; 11 12 ], [ 13 14; 15 16 ]); 

class(MyScalar) 
ans = 
    double 

class(MyHorizVector) 
ans = 
    double 

class(MyVertVector) 
ans = 
    double 

class(MyMatrix) 
ans = 
    double 

class(My4Darray) 
ans = 
    double 

그래서,이 모든 5 개 개의 다른 배열의 클래스는 double입니다. double은 사용 된 숫자 정밀도 (배정 밀도)를 의미합니다.

셀 배열은보다 추상적 인 개념입니다. 셀 배열은 하나 이상의 배열을 포함 할 수 있으며 배열이 아닌 다른 유형의 변수도 포함 할 수 있습니다. 셀 배열은 셀 배열이 보유 할 수있는 모든 것을 다시 저장할 수있는 다른 셀 배열도 보유 할 수 있습니다. 따라서 셀 배열을 서로 내부에 재귀 적으로 저장할 수도 있습니다.

셀 배열은 서로 다른 객체를 단일 변수로 결합하는 데 유용합니다. 함수에 전달되거나 cellfun으로 처리됩니다. 각 셀 배열은 하나 이상의 셀로 구성됩니다. 임의의 배열은 {} 연산자를 사용하여 셀 배열로 변환 할 수 있으며 결과는 1x1 셀 배열입니다. 사용할 수있는 명령은 mat2cellnum2cell입니다.

MyCellArrayContainingMyScalar = { MyScalar }; 
MyCellArrayContainingMyHorizVector = { MyHorizVector }; 
MyCellArrayContainingMyCellArrayContainingMyScalar = { MyCellArrayContainingMyScalar }; 

위에서 만든 모든 셀 배열은 1x1 셀 배열입니다. 하나의 셀 어레이와 동일한 배열로 존재할 수없는 여러 가지 종류의 데이터를 저장할 수 있기 때문에

class(MyCellArrayContainingMyScalar) 
ans = 
    cell 

class(MyCellArrayContainingMyHorizVector) 
ans = 
    cell 

class(MyCellArrayContainingMyCellArrayContainingMyScalar) 
ans = 
    cell 

아니라 모든 셀 어레이는 cell2mat을 이용하여 행렬로 변환 할 수있다.

cell2mat(MyCellArrayContainingMyScalar) 
ans = 
    1 

cell2mat(MyCellArrayContainingMyHorizVector) 
ans = 
    1  2  3 

그러나 이것이 실패 :

cell2mat(MyCellArrayContainingMyCellArrayContainingMyScalar); 

Error using cell2mat (line 53) 
Cannot support cell arrays containing cell arrays or objects. 

그러나의 다른 배열로 구성된 셀 어레이의 다른 종류 해보자 :

이 작업 할

MyCellArray{1} = [ 1 2 3 ]; 
MyCellArray{2} = 'This is the 2nd cell of MyCellArray!'; 

class(MyCellArray) 
ans = 
    cell 

이 셀을 배열을 배열로 변환 할 수 없습니다. cell2mat :

cell2mat(MyCellArray) 

Error using cell2mat (line 46) 
All contents of the input cell array must be of the same data type. 

희망이 있다면 도움이 될 것입니다.

+0

+1 : 좋은 설명 :) –

5

nrz의 대답에 덧붙여 셀 배열을 저장할 때 추가 메모리 오버 헤드가 있다는 것이 주목할 만합니다. 다음과 같은 출력을 생성

A = 1:5 
B = {A} 
C = num2cell(A) 
whos 

: 예를 들어, 다음 코드를 고려

A = 
    1  2  3  4  5 


B =  
    [1x5 double] 


C = 
    [1] [2] [3] [4] [5] 

    Name  Size   Bytes Class  Attributes  
    A   1x5    40 double    
    B   1x1    152 cell     
    C   1x5    600 cell     
  • 첫 번째 줄에서 볼 수 있듯이, 복식의 기본 (1) 별 5 벡터 A 메모리에서 40 바이트를 사용합니다 (각 더블은 8 바이트 소요).
  • 두 번째 줄은 B을 생성하기 위해 단일 셀로 A을 래핑하면 여분의 112 바이트가 추가된다는 것을 알 수 있습니다. 그것은 MATLAB에서 단일 셀의 오버 헤드입니다.
  • C은 5 개의 셀을 포함하고 (112 + 8) × 5 = 600 바이트를 차지하기 때문에 세 번째 줄은이를 확인합니다.
+0

나는 이것에 대해 매우 혼란스러워. 행렬에는 지오메트리에 대한 정보가 필요하다고 생각했습니다. 그러나 나는 당신과 같은 결과를 얻습니다. – bdecaf

+0

@bdecaf 정보는 아마도 여기에 포함되지 않은 변수 이름과 함께 어딘가에 저장됩니다 :-) –

관련 문제