从两个2d矩阵中获取许多3d矩阵(逐列乘法)

Sim*_*mon 3 matlab matrix vectorization multiplication bsxfun

有没有循环执行以下操作的更快方法?

n = 2;
m = 1000;
A = rand(n,m);
B = rand(n,m);

C = zeros(n*n,m);
for i = 1 : m
    tmp = A(:,i) * B(:,i)';
    C(:,i) = tmp(:);
end
Run Code Online (Sandbox Code Playgroud)

基本上我需要m nxnA和之间使用列方式矩阵乘法来获得矩阵B.然后我需要这种矩阵的矢量化.

lhc*_*eva 6

您可以完全向量化这种使用repmat,KRON重塑或使用Divakar的溶液bsxfun,permuterepmat它给你在速度方面的另一个显著的改善.

tic
for j = 1:1000
A1 = repmat(A, n, 1);
B1 = kron(B,ones(n,1));
D = reshape(A1(:).*B1(:), n*n, m);
end
toc
Run Code Online (Sandbox Code Playgroud)

经过的时间是0.117396秒.

tic
for j = 1:1000
C = zeros(n*n,m);
for i = 1 : m
    tmp = A(:,i) * B(:,i)';
    C(:,i) = tmp(:);
end
end
toc
Run Code Online (Sandbox Code Playgroud)

经过的时间是5.751179秒.

所以,加速大约是50倍.但是,正如下面的评论中所讨论的那样,加速通常取决于矩阵的大小和任务执行的次数.