【问题标题】:Sum of product each row by a matrix矩阵每行的乘积之和
【发布时间】:2013-08-28 18:25:39
【问题描述】:

我有一个矩阵A 和一个三维矩阵B。我想总结(i)

A(i,:)*B(i,:,:),

但i 没有循环。

【问题讨论】:

  • 不确定这是否是您所需要的,但是如何:M=bsxfun(@times,A(i,:),B(i,:,:)); sum(M(:)) 也许您可以展示如何使用循环来实现,然后我们可以看到如何对其进行矢量化。
  • 有助于准确地给出矩阵的尺寸,然后我们可以发布更精确的答案。使用 bsxfun 可能是你最好的选择,就像 Dennis 使用的那样
  • @DennisJaheruddin,但我不想使用循环(在您的版本中由 i 提供)
  • @АлександрКуракин 您可能希望在最终结果中避免使用它们。但是,如果您没有准确地向我们展示您想要发生的事情,我们需要猜测您想要实现的目标。希望 Amro 能够在他的回答中做到这一点。
  • 是的,我以我理解的方式发布了该问题的解决方案。如果不匹配,那么您需要进一步解释。无论哪种方式,我都会投票搁置,直到您明确表示您在问。

标签: matlab matrix octave vectorization matrix-multiplication


【解决方案1】:

这是另一种解决方案,稍微短一点:

C = A(:).'*reshape(B,[],size(B,3));

为了更具可读性,您可以使用类似的等效解决方案

C = arrayfun(@(x) sum(sum(A.*B(:,:,x))), 1:size(B,3));

但很可能第一个解决方案会表现得更好。

【讨论】:

  • 谢谢!第二个版本在我的作业中是循环等效的......但第一个很好!
【解决方案2】:

我发现评论与我的想法不完全一致。也许这就是您要寻找的:

M=bsxfun(@times,A,B); 
sum(M(:))

【讨论】:

    【解决方案3】:

    我将首先创建一些类似于您描述的随机矩阵:

    n = 4; m =3;
    A = rand(n,m);
    B = rand(n,m,5);
    

    1) 循环版本:

    C = zeros(1,size(B,3));
    for i=1:n
        C = C + A(i,:)*squeeze(B(i,:,:));
    end
    

    基本上它执行A的每一行与B的相应切片的矩阵乘法,并累加总和。

    这可以通过在循环外对矩阵B 进行置换来略微改善,从而避免多次调用squeeze...

    2) 矢量化版本:

    C = sum(sum(bsxfun(@times, permute(A,[2 3 1]),  permute(B, [2 3 1])),1),3);
    

    我没有声称这应该更快。事实上,我怀疑循环版本更快且内存占用更少。

    我将留给您使用实际尺寸来比较两者。

    【讨论】:

    • 这似乎正是我想要的!谢谢!!!附言我无法正确使用bsxfun,因为我没有正确使用permute。
    • @АлександрКуракин:我很高兴你解决了你的问题,但我不确定你的意思是什么,bsxfun 应该可以工作.. 所以我的评论仍然有效,你应该编辑你的问题并添加更多细节。此网站上的帖子应该足够清晰,以便对其他读者以及最初提出问题的人有所帮助。
    • 如果A 大小等于B 大小?总和i:A(i,:,:)*B(i,:,:)?非常感谢!
    • 您的问题表述得不是很好。对于初学者,size(A(i,:,:)) 将是 [1 n m],但 MATLAB 中的矩阵乘法仅针对 2D 矩阵定义。假设您打算首先使用squeeze,那么您仍然必须确保尺寸与size(A,3) 兼容,等于size(B,2).. 所以我再次要求您编辑您的问题并更具体,添加更多详细信息准确突出您需要的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多