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将通过复制两个输入参数的维度来执行请求的元素操作(函数句柄参数),以使它们在大小上相互匹配。在这种情况下,您可以避免使用BSXFUN ,方法是复制变量us自己使用函数REPMAT使它们的大小与data. 然后您可以使用标准的逐元素算术运算符

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 回答