Matlab';s bsxfun()代码

Matlab';s bsxfun()代码,matlab,bsxfun,Matlab,Bsxfun,这有什么用 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 = bsxfu

这有什么用

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,是否有一种等效的方法来执行此操作?

该函数将通过复制两个输入参数的维度来执行请求的元素操作(函数句柄参数),以便它们在大小上相互匹配。在这种情况下,您可以通过使用函数自己复制变量
u
s
来避免使用。然后您可以使用标准:


bsxfun
按元素执行二进制操作。当需要从矩阵中沿特定维度的所有元素中减去向量(在本例中为
u
)时(在本例中为
data
),该函数非常有用。在这两种情况下,执行操作的尺寸必须匹配。对于您的示例,您可以在不使用
bsxfun
as的情况下合并代码

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

其他操作也是如此。

代码结果肯定是等效的,但是
bsxfun
可以节省计算和内存资源(与
repmat
+运算符组合相比)。有时可能是在内存中操作或交换之间的差异。因此,如果可能的话,我个人会使用
bsxfun
而不是
repmat
。@Binus:这可能是真的,但我想用一个简单的矢量化解决方案替换对bsxfun的三个调用会给你带来一些好处,至少是更好的可读性。好的,你是对的。有时可读性比性能好。但对于其他所有函数,都有BSXFUN:D(我倾向于过度使用该函数。有一次我编写了包含3个BSXFUN的复杂表达式,后来用一个矩阵乘法替换了它……)
u1=repmat(u,size(data,2),1);
deviance=data-u1;