为了减少我的Matlab代码中循环的使用,我试图使用元素乘法来计算矩阵值。以下是我最初的代码
for doc = 1:docs
for word = 1:words
den =0;
for topic = 1:topics
posterior(topic,doc,word) =prior(1,topic)*expDoc(doc,topic)*expWord(word,topic);
den = den + posterior(topic,doc,word) ;
end
end
end
参考similar问题。以下是我的尝试
posterior(1:topics,1:docs,1:words) = prior(1,1:topics).*expDoc(1:docs,1:topics).*expWord(1:words,1:topics);
den = sum(posterior(:,:,:));
posterior(:,:,:) = posterior(:,:,:)/(den);
但是,根据元素运算的要求,如何确保使用相同维度的矩阵进行乘法运算?
答案 0 :(得分:1)
您可以通过谨慎使用bsxfun
和permute
来实现这一目标。 permute
用于重新排列矩阵维度的顺序 - 我们将使用它来重新排列变量,以正确的顺序将它们与bsxfun
相乘。
据我所知,你有三个变量:
prior, size == [1,topics];
expDoc, size == [docs,topics];
expWord, size == [words,topics];
你想得到一个最终变量:
posterior, size == [topics,docs,words]
我认为您应该能够使用以下方法获取矩阵posterior
:
prior_perm = prior.';
expDoc_perm = expDoc.';
expWord_perm = permute(expWord,[2,3,1]);
posterior = bsxfun(@times,prior_perm,bsxfun(@times,expDoc_perm,expWord_perm));
den = sum(posterior(:));
你需要确保测试一下产生正确的输出,但我还没有。