Matlab:重复行和列并将其连接到新数组中

Matlab: repeat and concatenate rows and cols into new array

我有两个 4×4 数组:

a1 = [ 1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16 ]
a2 = [ 17 18 19 20; 21 22 23 24; 25 26 27 28; 29 30 31 32 ]

我需要创建 16×8 数组 C:

1   2   3   4   17  18  19  20
1   2   3   4   21  22  23  24
1   2   3   4   25  26  27  28
1   2   3   4   29  30  31  32
5   6   7   8   17  18  19  20
5   6   7   8   21  22  23  24
5   6   7   8   25  26  27  28
5   6   7   8   29  30  31  32
9   10  11  12  17  18  19  20
9   10  11  12  21  22  23  24
9   10  11  12  25  26  27  28
9   10  11  12  29  30  31  32
13  14  15  16  17  18  19  20
13  14  15  16  21  22  23  24
13  14  15  16  25  26  27  28
13  14  15  16  29  30  31  32

结果数组的左半部分(从第 1 列到第 4 列)C 应该重复数组第 i 行 4 次 a1,右半部分(从第 5 列到第 8 列) ) 应该重复 4 次数组 a2

下面是我的代码。

p=4
n=4

for i=1:n
    b=n*i;
    a=n*(i-1)+1;
for j=1:p
    for k=a:b
        C(k,j)=a1(i,j);
    end;
end;
end;

for i=1:n
    b=n*i;
    a=n*(i-1)+1;
for j=p+1:2*p
    l=1;
    for k=a:b
        C(k,j)=a2(l,j-p);
        l=l+1;
    end;
end;
end;
C;
size_C=size(C)

问题。是否可以在没有for循环的情况下创建结果数组C?我可以使用哪些功能?

是的,这是可能的。 一种方法是使用 kronrepmat

C = [ kron(a1, ones(4,1)) repmat(a2, 4, 1)]

也许 4 应该来自矩阵之一的大小

关注性能,这里使用 reshape and repmat -

% Store sizes
M = size(a1,1);
N = size(a2,1);

% Get the replicated version for a1 and a2 separately
parte1 = reshape(repmat(reshape(a1,1,M,[]),[N,1,1]),M*N,[])
parte2 = repmat(a2,[M,1]);

% Do columnar concatenatation for final output
out = [parte1 parte2]

一般情况下的示例 运行 -

a1 = % 3 x 4 array
     5     2     6     9
     7     4     7     6
     9     8     6     1
a2 = % 2 x 5 array
     7     7     1     9     2
     6     8     8     7     9
out =
     5     2     6     9     7     7     1     9     2
     5     2     6     9     6     8     8     7     9
     7     4     7     6     7     7     1     9     2
     7     4     7     6     6     8     8     7     9
     9     8     6     1     7     7     1     9     2
     9     8     6     1     6     8     8     7     9

您可以使用ndgrid生成行索引然后连接:

[ii, jj] = ndgrid(1:size(a2,1), 1:size(a1,1));
C = [a1(jj,:) a2(ii,:)];