【问题标题】:Matlab: repeat and concatenate rows and cols into new arrayMatlab:重复并将行和列连接到新数组中
【发布时间】:2017-01-08 00:28:43
【问题描述】:

我有两个 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

结果数组C 的左半部分(从第 1 列到第 4 列)应重复数组 a1 的第 i 行 4 次,右半部分(从第 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?我可以使用哪些功能?

【问题讨论】:

    标签: arrays matlab for-loop concatenation repeat


    【解决方案1】:

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

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

    也许4应该从其中一个矩阵的大小推导出来

    【讨论】:

    • 智能 matlab 单线解决方案 ;) 使用 length(a1)length(a2) 而不是简单的值 4,因为 nilZ0r 建议使用更灵活和健壮的算法。
    • ... 或更好的 size(ax,1) 使其适用于非方阵
    【解决方案2】:

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

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

    【讨论】:

    • 它假定a1a2 的形状相同?
    【解决方案3】:

    关注性能,这里使用reshaperepmat -

    % 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
    

    【讨论】:

    • "parte":练习西班牙语? :-)
    • @LuisMendo 好吧,我在我的帖子中一直在使用它!你应该早点注意到的!
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 2021-02-25
    • 1970-01-01
    • 2015-06-20
    • 2015-12-17
    相关资源
    最近更新 更多