Domanda

Cosa fa questo?

u = [5 6];
s = [1 1];
data1    =[randn(10,1) -1*ones(10,1)];
data2    =[randn(10,1) ones(10,1)];
data     = [data1; data2];
deviance = bsxfun(@minus,data,u);  
deviance = bsxfun(@rdivide,deviance,s); 
deviance = deviance .^ 2; 
deviance = bsxfun(@plus,deviance,2*log(abs(s)));
[dummy,mini] = min(deviance,[],2);

Esiste un modo equivalente di farlo senza BSXFUN?

È stato utile?

Soluzione

La funzione Bsxfun eseguirà l'operazione di elemento richiesto (argomento gestisce la funzione) replicando le dimensioni dei due argomenti di input in modo che si abbinano a dimensioni. Puoi evitare l'uso di Bsxfun In questo caso replicando le variabili u e s te stesso usando la funzione Repmat per renderli ciascuno delle stesse dimensioni di data. Quindi puoi usare lo standard Operatori aritmetici per elementi:

u = repmat(u,size(data,1),1);  %# Replicate u so it becomes a 20-by-2 array
s = repmat(s,size(data,1),1);  %# Replicate s so it becomes a 20-by-2 array
deviance = ((data-u)./s).^2 + 2.*log(abs(s));  %# Shortened to one line

Altri suggerimenti

bsxfun Elemento binario è saggio dell'elemento. È utile quando è necessario sottrarre un vettore (in questo caso u) da tutti gli elementi lungo una dimensione particolare in una matrice (in questo caso data). La dimensione lungo la quale viene eseguita l'operazione deve corrispondere in entrambi i casi. Per il tuo esempio, puoi incorporare il codice senza bsxfun come

u1=repmat(u,size(data,2),1);
deviance=data-u1;

e così via per le altre operazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top