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?
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.