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
nxn
在A
和之间使用列方式矩阵乘法来获得矩阵B
.然后我需要这种矩阵的矢量化.
您可以完全向量化这种使用repmat,KRON和重塑或使用Divakar的溶液bsxfun
,permute
和repmat
它给你在速度方面的另一个显著的改善.
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倍.但是,正如下面的评论中所讨论的那样,加速通常取决于矩阵的大小和任务执行的次数.