我试图把一个小矩阵中的每个元素(比如说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中感觉不对,一定有更漂亮的方法去做吗?
发布于 2013-12-04 00:14:33
一种可能是使用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))));
发布于 2013-12-04 00:20:38
如果您有图像处理工具箱,可以尝试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
https://stackoverflow.com/questions/20364344
复制相似问题