2015-10-21 45 views
5

請讓我嘗試在這種情況的一個例子MATLAB 2013a:總和+擠壓尺寸不一致

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))) 

解釋,輸出將是

ans = 1 20 
ans = 20 2 

這意味着我必須抓住特殊其中numel_last_x == 1應用轉置操作以與後續步驟保持一致。我猜測必須有更優雅的解決方案。你們能幫我嗎?

編輯:對不起,代碼錯了!

回答

5

以下意見是這裏的關鍵:

  1. 你提的是深深的埋在Matlab語言的不一致:所有的數組都被認爲是至少2D。例如,ndims(pi)給出2
  2. Matlab中的另一個規則是假定所有的數組都有無限多的尾隨單獨維數。例如,size(pi,5)給出1

根據觀察1,squeeze將不會刪除單身尺寸,如果這樣做會少於兩個維度。這是在文件中所提及:

B = squeeze(A)返回一個數組B與相同的元件A,但與所有單維除去。單身人士維度是size(A,dim) = 1的任何維度。 二維陣列不受squeeze;如果A是行向量或列向量或標量(1乘1)值,則B = A

如果你想擺脫第一單身的,你可以利用觀察2和使用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) 

ans = 
    20  1 
ans = 
    20  2 
2

你可以使用shiftdim,而不是擠

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