3

これは何をしますか?

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

bsxfunなしでこれを行う同等の方法はありますか?

4

2 に答える 2

3

関数BSXFUNは、サイズが互いに一致するように 2 つの入力引数の次元を複製することにより、要求された要素単位の操作 (関数ハンドル引数) を実行します。この場合、変数をレプリケートし、関数REPMATを使用してそれぞれを と同じサイズにすることで、 BSXFUNの使用を避けることができます。次に、標準の要素ごとの算術演算子を使用できます。usdata

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
于 2011-03-21T19:49:32.610 に答える
2

bsxfun二項演算を要素単位で行います。u行列 (この場合は ) の特定の次元に沿ったすべての要素からベクトル (この場合は ) を減算する必要がある場合に便利ですdata。操作が実行されるディメンションは、両方の場合で一致する必要があります。あなたの例では、bsxfunasなしでコードを組み込むことができます

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

他の操作についても同様です。

于 2011-03-21T19:51:32.850 に答える