2013-06-24 37 views
6

Trong Matlab, chúng ta có thể sụp đổ trên kích thước của một mảng như thế này:Làm cách nào để thu gọn mảng trên một tập hợp thứ nguyên cụ thể?

M  = rand(3,4,5); 
myvec = M(:);  % gives a 60-element vector 

Tôi nghĩ rằng nó được gọi là serialising hoặc làm phẳng. Thứ tự của các yếu tố là dim1 đầu tiên, sau đó dim2, sau đó dim3 - để bạn có được [M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...].

Nhưng những gì tôi muốn làm là sụp đổ chỉ dọc theo hai chiều đầu tiên:

mymatrix = M(:: , :); % something that works like this? 

để đưa ra một ma trận 12 x 5. Vì vậy, ví dụ, bạn sẽ có được

[M(1,1,1) M(1,1,2) M(1,1,3) M(1,1,4) M(1,1,5) 
M(2,1,1) M(2,1,2) M(2,1,3) M(2,1,4) M(2,1,5) 
M(3,1,1) M(3,1,2) M(3,1,3) M(3,1,4) M(3,1,5) 
M(1,2,1) M(1,2,2) M(1,2,3) M(1,2,4) M(1,2,5) 
... 
] 

Vì vậy mà kích thước đầu tiên của mymatrix là "phẳng" 1st và kích thước thứ 2 của bản gốc M, nhưng giữ gìn bất kỳ không gian khác.

Tôi thực sự cần làm điều này cho "kích thước trung bình 3" của mảng 5 chiều, vì vậy giải pháp chung sẽ tuyệt vời! ví dụ. W=rand(N,N,N,N,N); mymatrix = W(:, :::, :) nên cung cấp ma trận N x N^3 x N nếu bạn hiểu ý tôi.

Cảm ơn

Trả lời

5

Sử dụng reshape với dấu ngoặc vuông ([]) để thay thế cho một trong các đối số chiều dài chiều:

sz = size(M); 
mymatrix = reshape(M, [], sz(end));  % # Collapse first two dimensions 

hoặc

mymatrix = reshape(M, sz(1), [], sz(end)); % # Collapse middle dimensions 

Các placeholder [] nói reshape để tính toán kích thước tự động. Lưu ý rằng bạn chỉ có thể sử dụng một lần xuất hiện là []. Tất cả chiều dài thứ nguyên khác phải được chỉ định rõ ràng.

+0

Cảm ơn bạn! Nên nghĩ về việc định hình lại. PS Tôi chỉ nghĩ về một cách khác mà dường như làm việc: 'tmp = permute (M, [1,5,2,3,4]);', 'mymatrix = tmp (:, :)'. Bạn không chắc chắn nó sẽ luôn hoạt động? Tất nhiên 'reshape' là ** nhiều ** thích hợp hơn. –

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