首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将一个小矩阵乘以一个大矩阵

将一个小矩阵乘以一个大矩阵
EN

Stack Overflow用户
提问于 2013-12-04 00:12:05
回答 2查看 1.3K关注 0票数 3

我试图把一个小矩阵中的每个元素(比如说2x2)乘以一个大矩阵中的每个位置(比方说4x4),一个元素一个一个。

所以我想:

代码语言:javascript
运行
复制
        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中感觉不对,一定有更漂亮的方法去做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-04 00:14:33

一种可能是使用repmat在必要时重复小矩阵多次。

代码语言:javascript
运行
复制
C = repmat(A,size(B,1)/size(A,1),size(B,2)/size(A,2)).*B

另一种避免了repmat的可能性是:分割大矩阵,在三维空间和四维空间排列片段,并使用bsxfun进行乘法。

代码语言:javascript
运行
复制
[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,从而节省内存:

代码语言:javascript
运行
复制
[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))));
票数 5
EN

Stack Overflow用户

发布于 2013-12-04 00:20:38

如果您有图像处理工具箱,可以尝试blkproc

代码语言:javascript
运行
复制
>> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20364344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档