/ / Jaka jest różnica między danymi przechowywanymi w komórce a danymi przechowywanymi jako podwójne w MATLAB? - tablice, matlab, macierz, podwójne, tablica komórek

Jaka jest różnica między danymi przechowywanymi w komórce a danymi przechowywanymi jako podwójne w MATLAB? - tablice, matlab, macierz, podwójne, tablica komórek

Mam dwie zmienne, które wyglądają dokładnie tak samo dla mnie, ale jedna jest <double> a drugi jest <cell>. W kodzie wydaje się, że są one konwertowane przez cell2mat. Rozumiem, że jest to kwestia przechowywania danych, ale po prostu nie widzę różnicy i definicji cell i double dla tego.

Odpowiedzi:

5 dla odpowiedzi № 1

Dodając do odpowiedzi nrz, warto zwrócić uwagę na dodatkowe obciążenie pamięci podczas przechowywania macierzy komórek.Na przykład rozważmy następujący kod:

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

który produkuje następujący wynik:

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
  • Jak widać z pierwszej linii, podstawowy wektor 1 na 5 A double zajmuje 40 bajtów w pamięci (każde podwójne zajmuje 8 bajtów).
  • Druga linia pokazuje, że tylko opakowanie A z pojedynczą komórką do produkcji B dodaje dodatkowe 112 bajtów. To jest obciążenie pojedynczej komórki w MATLAB.
  • Trzecia linia potwierdza to, ponieważ C zawiera 5 komórek i zajmuje (112 + 8) × 5 = 600 bajtów.

4 dla odpowiedzi nr 2

Tablice i macierze są prawdopodobnie dwoma najczęściej używanymi typami danych w MATLAB.

Tablice 1D i 2D są macierzami tak jak wmatematyka w algebrze liniowej. Ale tablice mogą być również wielowymiarowymi (n-wymiarowymi) tablicami, zwanymi również tensorami, MATLAB nazywa je wielowymiarowymi tablicami. Ponadto MATLAB nie dokonuje rozróżnienia między skalarami i tablicami ani między wektorami a innymi macierzami. Skalar to po prostu tablica 1x1 w MATLAB, a wektorami są tablice Nx1 i 1xN w MATLAB.

Kilka przykładów:

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

Tak więc klasa wszystkich tych 5 różnych tablic jest double, jak donosi class dowództwo. double oznacza używaną dokładność liczbową (podwójna precyzja).

Tablica komórek jest bardziej abstrakcyjną koncepcją. Tablica komórek może pomieścić jedną lub więcej tablic, może również zawierać inne typy zmiennych, które nie są tablicami. Tablica komórek może również zawierać inne tablice komórek, które mogą ponownie pomieścić dowolną komórkę. Zatem tablice komórek mogą być również przechowywane rekurencyjnie w sobie nawzajem.

Macierze komórkowe są przydatne do łączenia różnych obiektów w jedną zmienną, która może np. zostać przekazane do funkcji lub obsługiwane cellfun. Każda macierz składa się z 1 lub więcej komórek. Dowolna tablica może zostać przekonwertowana na tablicę komórek za pomocą { } operatorów, wynikiem jest macierz komórek 1x1. Istnieje również mat2cell i num2cell dostępne polecenia.

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

Wszystkie macierze komórkowe utworzone powyżej to macierze komórkowe 1x1.

class(MyCellArrayContainingMyScalar)
ans =
cell

class(MyCellArrayContainingMyHorizVector)
ans =
cell

class(MyCellArrayContainingMyCellArrayContainingMyScalar)
ans =
cell

Ale nie wszystkie macierze komórkowe można przekształcić w macierze za pomocą cell2mat, ponieważ tablica pojedynczej komórki może pomieścić kilka różnych typów danych, które nie mogą istnieć w tej samej tablicy.

Te działają:

cell2mat(MyCellArrayContainingMyScalar)
ans =
1

cell2mat(MyCellArrayContainingMyHorizVector)
ans =
1     2     3

Ale to się nie udaje:

cell2mat(MyCellArrayContainingMyCellArrayContainingMyScalar);

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

Ale spróbujmy innego rodzaju tablicy komórek składającej się z różnych tablic:

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

class(MyCellArray)
ans =
cell

Ta tablica komórek nie może zostać przekonwertowana do tablicy za pomocą cell2mat:

cell2mat(MyCellArray)

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

Mam nadzieję, że to pomoże uzyskać pomysł.