将每个子块与 MATLAB 中的矩阵相乘

Multiply each sub-block with a matrix in MATLAB

我想将矩阵 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 种不同的方法。计算克罗内克积似乎不是个好主意。即使具有重塑的解决方案也比更紧凑的 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

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

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

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

Kron 完全失败了。您的置换解决方案需要 0.006s 而循环需要 1.512s