Matlab的bsxfun()代码

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);
< p> 有没有不使用bsxfun的等效方法?< /p>
2个回答

3

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

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

2
代码结果肯定是等价的,但 bsxfun 可以节省计算和内存资源(与 repmat + 运算符组合相比)。有时这可能是在内存中操作或交换之间的差别。因此,如果可能的话,我个人会使用 bsxfun 而不是 repmat - Binus
1
@Binus:这可能是真的,但我想用一个简单的向量化解决方案替换三个BSXFUN调用至少可以带来更好的可读性,最起码也能获得一些收益。 - gnovice
好的,你是对的。有时可读性比性能更重要。但是对于其他所有事情,都有BSXFUN :D(我倾向于过度使用该函数。曾经我写了一个包含3个BSXFUN的复杂表达式,后来用一次矩阵乘法替换了它...) - Binus

2

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

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

以此类推,对于其他的操作也是如此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接