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;