2015-10-21 15 views
5

Xin vui lòng cho tôi cố gắng giải thích bằng một ví dụMATLAB 2013a: sum + chiều bóp mâu thuẫn

numel_last_a = 1; 
numel_last_b = 2 

a = rand(2,20,numel_last_a); 
b = rand(2,20,numel_last_b); 
size(squeeze(sum(a,1))) 
size(squeeze(sum(b,1))) 

trong trường hợp này, sản lượng sẽ

ans = 1 20 
ans = 20 2 

Điều này có nghĩa tôi phải nắm bắt được đặc biệt trường hợp numel_last_x == 1 để áp dụng thao tác chuyển vị trí cho tính nhất quán với các bước sau. Tôi đoán rằng phải có một giải pháp thanh lịch hơn. Các bạn có thể giúp tôi không?

Chỉnh sửa: xin lỗi, mã đã sai!

Trả lời

5

Các quan sát sau đây là chìa khóa ở đây:

  1. Các mâu thuẫn bạn đề cập đến được chôn sâu vào ngôn ngữ Matlab: tất cả các mảng được coi là ít nhất là 2D. Ví dụ: ndims(pi) cho số 2.
  2. Một quy tắc khác trong Matlab là tất cả các mảng được giả định có vô số các kích thước đơn đuôi sau. Ví dụ: size(pi,5) cho 1.

Theo quan sát 1, squeeze sẽ không loại bỏ các kích thước đơn nếu làm như vậy sẽ cung cấp ít hơn hai thứ nguyên. Này được đề cập trong tài liệu:

B = squeeze(A) trả về một mảng B với các yếu tố tương tự như A, nhưng với tất cả các kích thước singleton gỡ bỏ. Kích thước đơn là bất kỳ thứ nguyên nào trong đó size(A,dim) = 1. Mảng hai chiều không bị ảnh hưởng bởi squeeze; nếu A là một vectơ hàng hoặc cột hoặc giá trị vô hướng (1-by-1), thì B = A.

Nếu bạn muốn để có được thoát khỏi những singleton đầu tiên, bạn có thể khai thác quan sát 2 và sử dụng reshape:

numel_last_a = 1; 
numel_last_b = 2; 
a = rand(2,20,numel_last_a); 
b = rand(2,20,numel_last_b); 
as = reshape(sum(a,1), size(a,2), size(a,3)); 
bs = reshape(sum(b,1), size(b,2), size(b,3)); 
size(as) 
size(bs) 

cho

ans = 
    20  1 
ans = 
    20  2 
2

Bạn có thể sử dụng shiftdim thay vì bóp

numel_last_a = 1; 
numel_last_b = 2; 

a = rand(2,20,numel_last_a); 
b = rand(2,20,numel_last_b); 
size(shiftdim(sum(a,1))) 
size(shiftdim(sum(b,1))) 
ans = 

    20  1 


ans = 

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