2009-04-27 77 views
8

Giả sử tôi có ma trận 1-by-12 và tôi muốn đổi kích thước thành ma trận 4-by-3. Làm thế nào tôi có thể làm điều này?Làm cách nào để thay đổi kích thước ma trận trong MATLAB?

giải pháp hiện tại của tôi là loại xấu xí:

for n = 1:(length(mat)/3) 
    out(n,1:3) = mat(((n-1)*3 + 1):((n-1)*3 + 3)); 
end 

Có cách nào tốt hơn để làm điều này?

Trả lời

24

reshape dĩ nhiên là giải pháp thích hợp, như được nêu trong @gnovice.

Một tính năng tốt đẹp của reshape là nó cho phép này:

A = 1:12; 
B = reshape(A,4,[]); 
B = 
    1  5  9 
    2  6 10 
    3  7 11 
    4  8 12 

Vì vậy, nếu bạn không biết có bao nhiêu cột sẽ có, reshape sẽ tính toán điều đó cho bạn. Tương tự như vậy, reshape sẽ điền vào số hàng, nếu bạn bỏ qua.

C = reshape(A,[],4) 
C = 
    1  4  7 10 
    2  5  8 11 
    3  6  9 12 
+2

+1: Tốt! Tôi thực sự không bao giờ nhận thấy rằng trước đây. Tôi đoán tôi không bao giờ phải sử dụng nó. – gnovice

12

Thử RESHAPE chức năng:

A = (1-by-12 matrix); 
B = reshape(A,4,3); 

Lưu ý rằng ma trận B sẽ được lấp đầy với các yếu tố từ Một trong một thời trang theo cột (ví dụ cột sẽ được lấp đầy từ trên xuống dưới, di chuyển trái sang đúng).

Ví dụ:

>> A = 1:12; 
>> B = reshape(A,4,3) 

B = 

    1  5  9 
    2  6 10 
    3  7 11 
    4  8 12 
+0

Lưu ý rằng định dạng lại trả về lỗi nếu A không có chính xác 4 * 3 yếu tố. – AnnaR

+0

Vâng, đó là hành vi mong đợi bình thường của RESHAPE. – gnovice

+1

Chúng ta không thể yêu cầu RESHAPE thêm số không nếu không có chính xác 4 * 3 phần tử? Ý tôi là nếu có ít hơn 12 yếu tố. –

9

để mở rộng giải pháp gnovice của:

Nếu bạn cần một thứ tự khác nhau của xây dựng ma trận, sử dụng chuyển vị (của nhà điều hành) hoặc permute() để thay đổi thứ tự chiều sau khi bạn đã gọi reshape().

+0

+1: Điểm tốt về chuyển vị và PERMUTE. Đôi khi chúng cần thiết sau khi định hình lại. – gnovice

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