我有这个复杂的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
不太确定如何从这一点继续,主要是错误和错误的结果!
答案 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)
显然,问题中的代码可以用作一个很好的newParams
和bsxfun
练习会话来矢量化所有内容。我理解这与问题中的问题有所不同,但将其作为替代解决方案。
回过头来,要实际向量化所有内容,您需要使用permute
扩展维度并继续使用permute
。实现看起来像这样 -
bsxfun