将一个小矩阵乘以一个大矩阵

Ric*_*ard 3 matlab matrix linear-algebra matrix-multiplication

我试图将一个小矩阵(比如2x2)中的每个元素与一个大矩阵中的每个位置(比如说4x4)相乘,逐个元素.

所以我想:

        1 2 3 4     1 0 3 0
1 0     1 2 3 4     0 0 0 0
0 0 'x' 1 2 3 4  =  1 0 3 0
        1 2 3 4     0 0 0 0
Run Code Online (Sandbox Code Playgroud)

小矩阵在其适合的情况下应用多次,并且乘法是逐个元素的.我尝试了一堆循环,但在MATLAB中感觉不对,必须有更漂亮的方法吗?

Lui*_*ndo 5

一种可能性是使用repmat多次重复的小矩阵需要:

C = repmat(A,size(B,1)/size(A,1),size(B,2)/size(A,2)).*B
Run Code Online (Sandbox Code Playgroud)

另一种可能性,避免repmat:切割大矩阵,在第三和第四维度排列碎片,并用于bsxfun进行乘法运算:

[m n] = size(A);
[M N] = size(B);
T = permute(reshape(B,M,n,[]), [2 1 3]);
T = permute(reshape(T,n,m,[],size(T,3)),[2 1 3 4]);
C = cell2mat(squeeze(mat2cell(bsxfun(@times,T,A),m,n,ones(1,M/m),ones(1,N/n))));
Run Code Online (Sandbox Code Playgroud)

(这两条线T = ...都是切割,是由于A. Donda.)

这种方法的优点是,如果内存是个问题,你可以覆盖B而不是定义T,从而节省内存:

[m n] = size(A);
[M N] = size(B);
B = permute(reshape(B,M,n,[]),[2 1 3]);
B = permute(reshape(B,n,m,[],size(B,3)),[2 1 3 4]);
C = cell2mat(squeeze(mat2cell(bsxfun(@times,B,A),m,n,ones(1,M/m),ones(1,N/n))));
Run Code Online (Sandbox Code Playgroud)