在MATLAB中将小矩阵移到大矩阵中

在MATLAB中将小矩阵移到大矩阵中,matlab,matrix,move,Matlab,Matrix,Move,假设A是一个5x5的零矩阵: >> A = zeros(5) A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 B是一个由1(2x2)组成的小矩阵: 现在,我正在寻找16种不同的情况,它们表示C1、C2、C3、…、

假设A是一个5x5的零矩阵:

>> A = zeros(5)

A =

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
B是一个由1(2x2)组成的小矩阵:

现在,我正在寻找16种不同的情况,它们表示
C1、C2、C3、…、C16

它们是:

C1 =                                

     1     1     0     0     0
     1     1     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0

C2 =                                

     0     0     0     0     0
     1     1     0     0     0
     1     1     0     0     0
     0     0     0     0     0
     0     0     0     0     0



C3 =                                

     0     0     0     0     0
     0     0     0     0     0
     1     1     0     0     0
     1     1     0     0     0
     0     0     0     0     0
。。。最后,
C16
等于:

C16 =                                

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     1     1
     0     0     0     1     1
如你们所见,它就像较小的矩阵(B)在较大的矩阵(A)内部移动


非常感谢,

您可以在适当的行和列上使用
circshift(…)
实现您想要的功能。您提到的示例是页面“移动矩阵元素”部分中显示的示例,其中显示了4x4矩阵

例如

A = [1 1 0 0; 1 1 0 0; 0 0 0 0; 0 0 0 0]
A =

     1     1     0     0
     1     1     0     0
     0     0     0     0
     0     0     0     0
Y = circshift(A,[1 1])
Y =

     0     0     0     0
     0     1     1     0
     0     1     1     0
     0     0     0     0
在Mathworks网站上,有一个内置函数,它似乎可以完全满足您的需求。在5x5矩阵上显示16种组合的精确代码是

编辑:所以它现在有一个5x5x16矩阵,输出称为C

A=zeros(5,5);
A(1:2,1:2)=1
c=1;C=zeros(5,5,16);
for i=0:3
    for j=0:3
        C(:,:,c)=circshift(A,[i j])
        c=c+1;
    end
end
这将产生输出(注释输出未编辑)


我认为这样做很好

A = zeros(5);
B = ones(2);
C = cell(size(A,1)-size(B,1) + 1, size(A,2)-size(B,2) + 1);

for i = 1:size(A,1)-size(B,1) + 1
    for j = 1:size(A,2)-size(B,2) + 1
        C{i, j} = A;
        C{i, j}(i:i+size(B,1) - 1, j:j+size(B,2) - 1) = B;

        % Additional code here
    end
end

C = C(:);

% Additional code here

一种矢量化方法-

样本运行-

A =
     1     1     8     4
     9     8     8     2
     7     9     5     1
     7     9     2     9
B =
     3     5
     3     6
     3     1
C(:,:,1) =
     3     5     8     4
     3     6     8     2
     3     1     5     1
     7     9     2     9
C(:,:,2) =
     1     1     8     4
     3     5     8     2
     3     6     5     1
     3     1     2     9
C(:,:,3) =
     1     3     5     4
     9     3     6     2
     7     3     1     1
     7     9     2     9
....

C(:,:,6) =
     1     1     8     4
     9     8     3     5
     7     9     3     6
     7     9     3     1

你的问题到底是什么?@shrey如何将矩阵A移到矩阵B的内部。因为Matlab有一个内置函数来解决这个问题。如果你仔细观察这个问题,它只表明2x2矩阵似乎正在通过较大的5x5矩阵移动,而不是较小矩阵通过较大矩阵的实际移动对于问题的解决至关重要。OP想要16个矩阵的输出(在示例中)。我的代码输出了这一点,我认为如果我们都必须使用
进行
循环,不管是使用索引还是
circshift
。使用matlab内置函数通常比执行相同操作的自定义函数具有更好的性能,我相信在这种情况下使用单元数组是不必要的。如果你编辑你的帖子,我将取消否决票,这样它就可以回到中立状态。我同意你使用
circshift
是一个更好的答案,但是,我认为,因为我们不知道OP想要这些矩阵做什么,所以单元格数组是更好的选择。我承认,我最初的否决票有点仓促。你提出了一些有效的观点,最好的解决方案可能是将这两个答案结合起来,并对问题进行澄清。我相信有一种
circshift
方法可以推广到任意大小的矩阵,这样它可以返回较大矩阵中较小矩阵的所有连续组合;至少对于稀疏矩阵,其中大多数元素为0。感谢您的时间伙伴。看起来也很棒!谢谢你抽出时间。你的解决方案看起来也很棒!
A = zeros(5);
B = ones(2);
C = cell(size(A,1)-size(B,1) + 1, size(A,2)-size(B,2) + 1);

for i = 1:size(A,1)-size(B,1) + 1
    for j = 1:size(A,2)-size(B,2) + 1
        C{i, j} = A;
        C{i, j}(i:i+size(B,1) - 1, j:j+size(B,2) - 1) = B;

        % Additional code here
    end
end

C = C(:);

% Additional code here
%// Get sizes and form size parameters for creating output
[mA,nA] = size(A);
[mB,nB] = size(B);
mC = mA - mB + 1;
nC = nA - nB + 1;

%// Get linear indices
stage1 = bsxfun(@plus,[1:mB]',[0:nB-1]*mA);    %//'
stage2 = bsxfun(@plus,[1:mC]',[0:nC-1]*mA)-1;  %//'
idx = bsxfun(@plus,stage1(:),stage2(:).' + [0:mC*nC-1]*mA*nA);   %//'

%// Replicate A to setup output; index into it with idx & replace B
C = repmat(A,1,1,mC*nC);
C(idx) = repmat(B(:),1,mC*nC)
A =
     1     1     8     4
     9     8     8     2
     7     9     5     1
     7     9     2     9
B =
     3     5
     3     6
     3     1
C(:,:,1) =
     3     5     8     4
     3     6     8     2
     3     1     5     1
     7     9     2     9
C(:,:,2) =
     1     1     8     4
     3     5     8     2
     3     6     5     1
     3     1     2     9
C(:,:,3) =
     1     3     5     4
     9     3     6     2
     7     3     1     1
     7     9     2     9
....

C(:,:,6) =
     1     1     8     4
     9     8     3     5
     7     9     3     6
     7     9     3     1