2010-02-13 71 views
23

Tôi có ma trận 3d (n-by-m-by-t) trong MATLAB đại diện cho các số đo n-by-m trong lưới trong một khoảng thời gian. Tôi muốn có ma trận 2d, trong đó thông tin không gian đã biến mất và chỉ có n*m số đo theo thời gian t còn lại (ví dụ: n*m-by-t)Định hình lại ma trận 3d thành ma trận 2d

Làm cách nào để thực hiện việc này?

Trả lời

28

Bạn cần lệnh reshape:

Say ma trận ban đầu của bạn là (chỉ dành riêng cho tôi để có được một số dữ liệu):

a=rand(4,6,8); 

Sau đó, nếu hai tọa độ cuối cùng là không gian (thời gian là 4, m là 6, n là 8) bạn sử dụng:

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

và bạn kết thúc bằng mảng 4x48.

Nếu hai đầu tiên là không gian và cuối cùng là thời gian (m là 4, n là 6, thời gian là 8), bạn sử dụng:

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

và bạn kết thúc với một mảng 24x8.

Đây là thao tác nhanh, O (1) (nó chỉ điều chỉnh tiêu đề của hình dạng của dữ liệu). Có nhiều cách khác để thực hiện nó, ví dụ: a=a(:,:) để ngưng tụ hai kích thước cuối cùng, nhưng định hình lại nhanh hơn.

11

Định hình lại tất nhiên là giải pháp chuẩn để định hình lại mảng. (Họ sẽ gọi nó là gì nữa?) Vẫn còn một vài thủ thuật để khám phá.

Trước hết, cách đơn giản nhất để biến mảng có kích thước [n, m, p] thành một mảng có kích thước [n * m, p]?

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

Nhưng tốt hơn là thế này:

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

Nếu bạn để một trong những lập luận để định hình lại trống rỗng, sau đó định hình lại tính kích thước dành cho bạn! Hãy cẩn thận, nếu bạn thử điều này và kích thước của A không phù hợp, sau đó bạn sẽ nhận được một lỗi. Do đó:

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

Về mặt logic, chúng tôi không thể tạo một mảng gồm hai cột từ thứ gì đó có 9 phần tử trong đó. Tôi đã đặt một chức năng gọi là wreshape trên trao đổi trung tâm MATLAB mà sẽ pad khi cần thiết để làm điều này hoạt động mà không có lỗi tạo ra.

Tất nhiên, bạn luôn có thể sử dụng thủ đoạn như

B = A(:); 

để tạo ra một vector trực tiếp từ một ma trận. Điều này tương đương với biểu mẫu

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

Một giải pháp tốt hơn cho vấn đề này là sử dụng nshape.m có sẵn từ Hộp công cụ N-Way của Rasmus Bro. Điều đó sẽ cho phép bạn định hình lại theo một chế độ nhất định, điều này phức tạp hơn một chút với lệnh định hình lại.

Các hộp công cụ có sẵn tại liên kết sau:

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

Có một số công cụ tuyệt vời khác có để giúp đỡ với thao tác mảng là tốt.

Các vấn đề liên quan