2010-03-18 41 views
12

Khi thao tác ma trận, việc thay đổi hình dạng của chúng thường thuận tiện hơn. Ví dụ, để biến một N x M có kích thước ma trận vào một vector có độ dài NX M. Trong MATLAB một Reshape chức năng tồn tại:Cách định hình lại ma trận trong Mathematica

reshape (X, M, N) trả về M-by-N ma trận có các phần tử được lấy theo cột từ X. Một kết quả lỗi nếu X không có các phần tử M * N.

Trong trường hợp chuyển đổi giữa một ma trận và vector Tôi có thể sử dụng chức năng Mathematica Flatten mà mất lợi thế của đại diện danh sách lồng nhau Mathematica cho ma trận. Như một ví dụ nhanh, giả sử tôi có một ma trận X:

4x4 matrix

Với Flatten [X] Tôi có thể nhận được các vector {1,2,3, ..., 16}. Nhưng điều gì sẽ xa hữu ích hơn là một cái gì đó tương tự như áp dụng Matlab của Reshape (X, 2,8) mà sẽ cho kết quả trong Matrix sau:

4x4 matrix

này sẽ cho phép tạo ra các ma trận tùy ý miễn là kích thước bằng N * M. Theo như tôi có thể nói, không có bất cứ điều gì được xây dựng trong đó làm cho tôi tự hỏi nếu ai đó đã không mã hóa một chức năng Reshape của riêng mình.

Trả lời

18
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n] 
3

Tôi biết đây là một chuỗi cũ nhưng vì mục đích lưu trữ và tìm kiếm trên google, tôi có cách tổng quát hơn cho phép độ dài m * n * ... liệt kê thành m * n * ... mảng:

Reshape[list_, shape__] := Module[{i = 1}, 
    NestWhile[Partition[#, shape[[i]]] &, list, ++i <= Length[shape] &] 
    ] 

Ví dụ:

In:= Reshape[Range[8], {2, 2, 2}] 

Out:= {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}} 
+0

Lưu ý: Giải pháp này transposes hai kích thước cuối cùng, vì vậy nó không khá làm việc. – Guillochon

4
Reshape[list_, dimensions_] := 
First[Fold[Partition[#1, #2] &, Flatten[list], Reverse[dimensions]]] 

Ví dụ Cách sử dụng:

In: Reshape[{1,2,3,4,5,6},{2,3}] 

Out: {{1,2,3},{4,5,6}} 

Điều này hoạt động với các mảng có chiều sâu tùy ý.

10

ArrayReshape thực hiện chính xác điều đó.

+0

lưu ý điều này không khả dụng khi câu hỏi được hỏi, nhưng có thể là câu trả lời hay nhất hiện nay .. (mới trong phiên bản 9) – agentp

+0

@george yes; đó là tinh thần của trang web để quảng bá câu trả lời thích ứng! –

0

Hiện cũng có một hàm mới ArrayReshape [].

Ví dụ:

{{1, 2, 3}, {4, 5, 6}} // MatrixForm 

ArrayReshape[{{1, 2, 3}, {4, 5, 6}}, {3, 2}] // MatrixForm 
+0

Tôi làm cách nào để định hình lại theo cột? tức là, các yếu tố đi xuống theo chiều dọc sau đó chuyển sang cột tiếp theo? –

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