将小矩阵乘以大矩阵

3

我想将一个小矩阵(例如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

小矩阵可以重复使用,直到适合为止,并且乘法是逐元素进行的。我尝试了很多循环,但在MATLAB中感觉不太对,一定有更优美的方法吧?

2个回答

5

一种可能性是使用repmat,将小矩阵重复多次,直到满足需求

C = repmat(A,size(B,1)/size(A,1),size(B,2)/size(A,2)).*B

另一种可能性是避免使用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))));

这两行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))));

1
如果您拥有图像处理工具箱,可以尝试使用 blkproc 函数:
>> A = magic(4)
A =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
>> B = [1 0; 0 0];
>> C = blkproc(A,size(B),@(x) x.*B)
C =
    16     0     3     0
     0     0     0     0
     9     0     6     0
     0     0     0     0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接