用向量乘以两个矩阵

时间:2017-06-14 05:01:29

标签: matlab matrix matrix-multiplication

我使用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 之类的东西无效。

下面的代码示例

{{1}}

2 个答案:

答案 0 :(得分:3)

这是怎么做的:

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

说明:诀窍是使用Cpermute从行向量(比如x方向)更改为第3维(或z方向),这就好像你已定义C不同:

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

现在,bsxfun是一种执行你编写的for循环的简洁方法。而已。

答案 1 :(得分:1)

你可以通过矩阵索引来实现这一点:

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