【问题标题】:Matlab's bsxfun() codeMatlab bsxfun() 代码
【发布时间】:2011-03-21 19:35:07
【问题描述】:

这是做什么的?

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 有没有等效的方法?

【问题讨论】:

    标签: matlab bsxfun


    【解决方案1】:

    函数BSXFUN 将通过复制两个输入参数的维度来执行请求的逐元素操作(函数句柄参数),以使它们在大小上相互匹配。在这种情况下,您可以避免使用BSXFUN,方法是使用函数REPMAT 自己复制变量us,使它们每个的大小都与data 相同。然后就可以使用标准的element-wise arithmetic operators

    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
    

    【讨论】:

    • 代码结果肯定是等价的,但是bsxfun可以为你节省计算和内存资源(相比repmat+运算符组合)。有时这可能是在内存中操作或交换之间的区别。所以如果可能的话,我个人会使用bsxfun 而不是repmat
    • @Binus:这可能是真的,但我想用一个简单的矢量化解决方案替换对 BSXFUN 的 三个 调用会获得一些东西至少更好的可读性。
    • 好吧,你是对的。有时可读性比性能更好。但是对于其他所有内容,都有 BSXFUN :D (我倾向于过度使用该函数。一旦我编写了包含 3 个 BSXFUN 的复杂表达式,后来被一个矩阵乘法替换......)
    【解决方案2】:

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

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

    其他操作以此类推。

    【讨论】:

      猜你喜欢
      • 2016-12-09
      • 2012-06-10
      • 2015-04-27
      • 1970-01-01
      • 2018-03-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多