【问题标题】:Multiplying two matrices by a vector将两个矩阵乘以一个向量
【发布时间】:2017-06-14 05:01:29
【问题描述】:

我使用loop 将两个矩阵乘以一个向量。不使用loop是否可以做到这一点?

D1=C.*(A.*B) 之类的东西不起作用。

以下代码示例

clear;
clc;
A=rand(5,5);
B=rand(5,5);
C=[0.1 0.3];
for ii=1:2
    D(:,:,ii)=A.*B.*C(ii);
end

【问题讨论】:

    标签: matlab matrix matrix-multiplication


    【解决方案1】:

    这是怎么做的:

     D=bsxfun(@times,A.*B,permute(C,[3 1 2]))
    

    解释:诀窍是使用permuteC 从行向量(例如x 方向)更改为第3 维(或z 方向),就好像您会以不同的方式定义C:

    C(:,:,1)=0.1;
    C(:,:,2)=0.3;
    

    现在,bsxfun 是一种执行您编写的 for 循环的紧凑方法。就是这样。

    【讨论】:

    • 非常感谢。根据这个。我们也可以这样做。 A=兰德(5,5); B=兰德(5,5); C=[0.1 0.3]; C1=重塑(C,[1,1,2]); D1=A.*B.*C1;
    【解决方案2】:

    您可以通过大多数矩阵索引来做到这一点:

    clear;
    clc;
    A=rand(5,5);
    B=rand(5,5);
    C=[0.1 0.3];
    
    % Get matrices to final size
    A = A(:,:,ones(length(C),1)); % repeat into third dimension as many times as length(C)
    B = B(:,:,ones(length(C),1)); % repeat into third dimension as many times as length(C)
    C = C(ones(1,size(A,2)),:,ones(1,size(A,1))); % make it size size(A,2)xlength(C)xsize(A,1) 
    C = permute(C,[3 1 2]); % change to correct order
    
    D = A.*B.*C;
    

    或者作为一个衬垫(更快,需要更少的内存并且不改变输入变量):

    D = A(:,:,ones(length(C),1)).*B(:,:,ones(length(C),1)).*permute(C(ones(1,size(A,2)),:,ones(1,size(A,1))),[3 1 2]);
    

    不过,我认为对于大多数矩阵大小,bsxfun 更快(并且可读性更好)。但是用索引解决问题要有趣得多:P

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2017-04-04
      • 2011-04-08
      相关资源
      最近更新 更多