【问题标题】:Matlab Element-wise Matrix MultiplicationMatlab逐元素矩阵乘法
【发布时间】:2014-10-28 03:05:45
【问题描述】:

为了减少我的 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);

但是,根据元素运算的要求,我如何确保乘法是使用相同维度的矩阵完成的?

【问题讨论】:

  • 您的尝试不会奏效,因为priorexpDocexpWord 都是 2D 数组,因此您不能使用逐元素乘法来获得 3D 数组。仔细考虑相乘的是什么。
  • 好的,那么你将如何优化 for 循环?

标签: matlab


【解决方案1】:

您可以通过仔细使用bsxfunpermute 来实现此功能。 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(:));

您需要确保测试它会产生正确的输出,但我没有。

【讨论】:

  • 那些permute( ..[2 1]) 可以被transposes 取代,而且必须更便宜。否则很好的解决方案! +1
  • @Divakar 啊,是的,是的。我是如此沉迷于整体解决方案,我错过了。干杯!
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 2016-06-04
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2018-12-20
相关资源
最近更新 更多