2015-10-21 12 views
5

Siete pregati di cercare di spiegare con un esempioMATLAB 2013a: sum + dimensione squeeze incongruenze

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

in questo caso, l'uscita sarà

ans = 1 20 
ans = 20 2 

Questo significa che devo prendere la speciale caso in cui numel_last_x == 1 per applicare un'operazione di trasposizione per coerenza con fasi successive. Immagino che ci debba essere una soluzione più elegante. Ragazzi potreste aiutarmi?

Modifica: mi spiace, il codice era sbagliato!

risposta

5

Le seguenti osservazioni sono chiave qui:

  1. L'incoerenza si parla è sepolto in profondità nel linguaggio Matlab: tutti gli array sono considerati almeno 2D. Ad esempio, ndims(pi)2.
  2. Un'altra regola in Matlab è che si presume che tutti gli array abbiano infinitamente molte dimensioni singleton finali. Ad esempio, size(pi,5) fornisce 1.

Secondo l'osservazione 1, squeeze non rimuoverà le dimensioni singleton se così facendo darebbe meno di due dimensioni. Questo è menzionato nella documentazione:

B = squeeze(A) restituisce un array B con gli stessi elementi A, ma con tutte le dimensioni di unico rimossi. Una dimensione singleton è qualsiasi dimensione per cui size(A,dim) = 1. Gli array bidimensionali non sono interessati da squeeze; se A è un vettore riga o colonna o un valore scalare (1 per 1), quindi B = A.

Se si vuole sbarazzarsi del primo Singleton , è possibile sfruttare l'osservazione 2 e utilizzare 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

Potreste usare shiftdim invece di spremere

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