Одним из возможных вариантов является использование 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))));