2013-12-04 4 views
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, должны быть более красивые способы сделать это?

ответ

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 
Смежные вопросы