/ / Qual é a diferença entre os dados armazenados em uma célula e os dados armazenados em dobro no MATLAB? - matrizes, matlab, matriz, dupla, matriz de células

Qual é a diferença entre os dados armazenados em uma célula e os dados armazenados como duplos no MATLAB? - arrays, matlab, matriz, double, cell-array

Eu tenho duas variáveis ​​que parecem exatamente iguais para mim, mas uma é <double> e o outro é <cell>. No código, parece que eles são convertidos por cell2mat. Entendo que é uma questão de armazenamento de dados, mas simplesmente não vejo a diferença e a definição de cell e double por esta.

Respostas:

5 para resposta № 1

Adicionando à resposta do nrz, vale ressaltar que há uma sobrecarga adicional de memória ao armazenar matrizes de células. Por exemplo, considere o seguinte código:

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

que produz a seguinte saída:

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
  • Como você pode ver na primeira linha, o vetor básico de 1 por 5 A de dobros ocupa 40 bytes de memória (cada duplo ocupa 8 bytes).
  • A segunda linha mostra que apenas empacotando A com uma única célula para produzir B adiciona 112 bytes extras. Essa é a sobrecarga de uma única célula no MATLAB.
  • A terceira linha confirma que, porque C contém 5 células e leva (112 + 8) × 5 = 600 bytes.

4 para resposta № 2

Matrizes e matrizes de células são provavelmente os dois tipos de dados mais usados ​​no MATLAB.

Matrizes 1D e 2D são matrizes, como emmatemática, em álgebra linear. Mas matrizes também podem ser matrizes multidimensionais (n-dimensionais), também chamadas de tensores, o MATLAB as chama de matrizes multidimensionais. Além disso, o MATLAB não faz distinção entre escalares e matrizes, nem entre vetores e outras matrizes. Um escalar é apenas uma matriz 1x1 no MATLAB e os vetores são matrizes Nx1 e 1xN no MATLAB.

Alguns exemplos:

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

Portanto, a classe de todas essas 5 matrizes diferentes é double, conforme relatado por class comando. double significa a precisão numérica usada (precisão dupla).

A matriz celular é um conceito mais abstrato. Uma matriz de células pode conter uma ou mais matrizes, também pode conter outros tipos de variáveis ​​que não são matrizes. Uma matriz de células também pode conter outras matrizes de células que podem conter novamente o que uma matriz de células pode conter. Portanto, as matrizes de células também podem ser armazenadas recursivamente umas nas outras.

Matrizes de células são úteis para combinar diferentes objetos em uma única variável que pode, por exemplo. ser passado para uma função ou manipulado com cellfun. Cada matriz de células consiste em 1 ou mais células. Qualquer matriz pode ser convertida em célula usando { } operadores, o resultado é uma matriz de células 1x1. Há também mat2cell e num2cell comandos disponíveis.

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

Todas as matrizes de células criadas acima são matrizes de células 1x1.

class(MyCellArrayContainingMyScalar)
ans =
cell

class(MyCellArrayContainingMyHorizVector)
ans =
cell

class(MyCellArrayContainingMyCellArrayContainingMyScalar)
ans =
cell

Mas nem todas as matrizes de células podem ser convertidas em matrizes usando cell2mat, porque uma única matriz de células pode conter vários tipos de dados diferentes que não podem existir na mesma matriz.

Estes funcionam:

cell2mat(MyCellArrayContainingMyScalar)
ans =
1

cell2mat(MyCellArrayContainingMyHorizVector)
ans =
1     2     3

Mas isso falha:

cell2mat(MyCellArrayContainingMyCellArrayContainingMyScalar);

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

Mas vamos tentar um tipo diferente de matriz de células que consiste em matrizes diferentes:

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

class(MyCellArray)
ans =
cell

Essa matriz de células também não pode ser convertida em uma matriz usando cell2mat:

cell2mat(MyCellArray)

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

Espero que isso ajude a ter uma idéia.