0

我想将矩阵 A mxn 的每个子块与矩阵 B pxq 相乘。例如,A 可以分为 k 个子块,每个子块的大小为 mxp。

A = [A_1 A_2 ... A_k]

结果矩阵将是 C = [A_1*B A_2*B ... A_k*B] 我想有效地做到这一点。

到目前为止,我尝试过的是:

C = A*kron(眼睛(k),B)

编辑:丹尼尔我认为你是对的。我尝试了 3 种不同的方法。计算克罗内克积似乎是个坏主意。即使是带有 reshape 的解决方案也比更紧凑的 kron 解决方案工作得更快。

tic 
for i=1:k
C1(:,(i-1)*q+1:i*q) = A(:,(i-1)*p+1:i*p)*B;
end
toc

tic
C2 = A*kron(eye(k),B);
toc

tic
A = reshape(permute(reshape(A,m,p,[]),[1 3 2]),m*k,[]);
C3 = A*B;
C3 = reshape(permute(reshape(C3,m,k,[]),[1 3 2]),m,[]);
toc
4

1 回答 1

0

当我查看您的矩阵乘法代码时,您在循环中拥有完美优化的代码。您无法击败矩阵乘法。您可以减少的一切都是迭代的开销,但与矩阵乘法的长运行时间相比,开销绝对没有影响。

当循环中的操作微不足道但循环迭代多次时,您尝试做的将是正确的策略。如果您采用以下参数,您会注意到您的permute解决方案实际上具有其优势,但不适用于您的问题维度:

q=1;p=1;n=1;m=1;
k=10^6

克朗完全失败了。您的置换解决方案需要0.006s循环时间1.512s

于 2016-02-15T01:46:09.433 回答