【问题标题】:Multiplying a small matrix by a big matrix小矩阵乘以大矩阵
【发布时间】:2013-12-20 06:56:02
【问题描述】:

我试图将一个小矩阵(比如 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 中感觉不对,一定有更漂亮的方法吗?

【问题讨论】:

    标签: matlab matrix linear-algebra matrix-multiplication


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果你有图片处理工具箱,可以试试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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-19
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多