2010-02-13 18 views
23

Mam matrycę 3D (n-by-m-by-t) w MATLAB reprezentującą pomiary n-by-m w siatce w pewnym okresie czasu. Chciałbym mieć 2d matrycy, gdzie informacja przestrzenna nie ma, a tylko n*m pomiary w czasie t są w lewo (czyli: n*m-by-t)Przekształć matrycę 3D na matrycę 2d

Jak mogę to zrobić?

Odpowiedz

28

Trzeba polecenia reshape:

że Twój początkowy macierz jest (tylko dla mnie, aby uzyskać pewne dane):

a=rand(4,6,8); 

Następnie, jeśli dwa ostatnie są współrzędne przestrzenne (czas wynosi 4, m to 6, n to 8), którego używasz:

a=reshape(a,[4 48]); 

, a otrzymasz tablicę 4x48.

gdy dwa są przestrzenne i ostatni czas (m wynosi 4, n oznacza 6, czas 8) można zapisać:

a=reshape(a,[24 8]); 

i kończy się z tablicy 24x8.

Jest to szybka operacja O (1) (dostosowuje tylko jej nagłówek do kształtu danych). Są inne sposoby robienia tego, np. a=a(:,:), aby skondensować dwa ostatnie wymiary, ale zmiana kształtu jest szybsza.

11

Przekształcenie jest oczywiście standardowym rozwiązaniem do przekształcania tablicy. (Jak inaczej mogliby to nazwać?) Jest jeszcze kilka sztuczek do odkrycia.

Po pierwsze, najprostszy sposób przekształcenia tablicy wielkości [n, m, p] w tablicę o rozmiarze [n * m, p]?

B = reshape(A,n*m,p); 

Ale lepiej jest to:

B = reshape(A,[],p); 

Jeśli zostawisz jeden z argumentów do przekształcenia pusty, a następnie przekształcenia oblicza rozmiar dla Ciebie! Bądź ostrożny, jeśli spróbujesz tego, a rozmiar A nie będzie zgodny, wtedy dostaniesz błąd. Tak więc:

reshape(magic(3),[],2) 
??? Error using ==> reshape 
Product of known dimensions, 2, not divisible into total number of elements, 9. 

Logicznie, nie możemy utworzyć tablicy z dwiema kolumnami z elementu zawierającego 9 elementów. Zrobiłem funkcję o nazwie wreshape na centralnej centrali MATLAB, która w razie potrzeby wykona tę operację, bez generowania błędu.

Oczywiście, zawsze można użyć sztuczki jak

B = A(:); 

stworzyć wektor bezpośrednio z matrycy. Jest to równoważne postaci

B=reshape(A,[],1); 
1

Lepszym rozwiązaniem tego problemu jest zastosowanie nshape.m dostępnego Rasmus bro w N-Way Toolbox. Umożliwi to zmianę kształtu w danym trybie, co jest nieco trudniejsze przy użyciu polecenia zmiany kształtu.

Przybornik jest dostępny pod następującym adresem:

https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

Istnieje kilka innych doskonałe narzędzia tam, aby pomóc przy manipulacji tablicy, jak również.

Powiązane problemy