简化复杂的表达式

时间:2015-10-11 20:58:43

标签: arrays matlab loops matrix bsxfun

我有这个复杂的MATLAB表达式,我想简化,以便我能真正理解它。

g = repmat(log(p), [size(x, 1), 1])
    for i = 1:size(mu, 1)
        g(:, i) = g(:, i) - sum(log(sigma(i, :)));
        g(:, i) = g(:, i) - sum(bsxfun(@rdivide, bsxfun(@minus, x, mu(i, :)).^2, 2*sigma(i, :).^2), 2);
    end

p=1x2
sigma=2x2
mu=2x2
x=30x2

基本上这些bsxfun函数让我很困惑。我想以简单的for循环的形式表达它。

我试过这样的事情:

[m,n] = size(x)
for i=1:m
        for j=1:n
            g(i,j)= log(p(j)) - sum(log(sigma(j))) - sum(data(i,j))... ;
        end
    end

不太确定如何从这一点继续,主要是错误和错误的结果!

2 个答案:

答案 0 :(得分:4)

我只是向您解释bsxfun,因为换一个for循环就像在速度方面将您的汽车换成自行车一样。

here这个精彩的答案中,bsxfun可以找到bsxfun(@minus, x, mu(i, :)) 的一般性介绍。

让我们逐步削减你的节目:

x

这只是告诉您@minus中的每个元素都会从mu(i,:)中的每个元素中减去(bsxfun)。现在这个bsxfun(@rdivide, bsxfun(@minus, x, mu(i, :)).^2, 2*sigma(i, :).^2) 嵌套在另一个中:

bsxfun

这个bsxfun分为两个部分,即Divakar。通过减去前面讨论的2*sigma(i,:).^2得到的每个元素除以sum中的每个元素,这是一个数组。

最后,整个事物的g(:,i)被用来获得单个值。对于i的每个实例,从i的原始条目中减去。

请注意,rdivide的做法非常糟糕,因此该代码的一项改进应该是将ii更改为例如n<span class="char-remain">500 Characters remaining</span> <textarea class="comment" rows="10" cols="50" maxlength="500">Enter Text Here</textarea> comment = $(".comment"); comment.on("keyup change", function(){ charCount = $(this).text().length; charRemain = 500 - charCount; $(this).prev("span").text("(" + charRemain + ")"); alert(charRemain + "Characters Remaining"); }); 或任何非内置函数;或者,正如Divakar善于在use i or j as a variable中展示一样,只需完全摆脱所有循环。

答案 1 :(得分:3)

显然,问题中的代码可以用作一个很好的newParamsbsxfun练习会话来矢量化所有内容。我理解这与问题中的问题有所不同,但将其作为替代解决方案。

回过头来,要实际向量化所有内容,您需要使用permute扩展维度并继续使用permute。实现看起来像这样 -

bsxfun
相关问题