18

假设我有一个一维数组:

a = [1, 2, 3];

是否有一个内置的 Matlab 函数,它接受一个数组和一个整数n并将数组的每个元素复制 n 次?

例如调用replicate(a, 3)应该返回[1,1,1,2,2,2,3,3,3]

请注意,这与repmat. 我当然可以replicate通过repmat对每个元素执行并连接结果来实现,但我想知道是否有一个更有效的内置函数。

4

7 回答 7

21

我是KRON功能的粉丝:

>> a = 1:3;
>> N = 3;
>> b = kron(a,ones(1,N))

b =

    1     1     1     2     2     2     3     3     3

您还可以查看这个相关问题(涉及复制二维矩阵的元素)以查看涉及矩阵索引的其他一些解决方案。这是一个这样的解决方案(受Edric 的回答启发):

>> b = a(ceil((1:N*numel(a))/N))

b =

    1     1     1     2     2     2     3     3     3
于 2009-12-22T17:24:32.523 回答
20
a = [1 2 3];
N = 3;

b = reshape(repmat(a,N,1), 1, [])
于 2009-12-22T19:28:50.830 回答
13

从 R2015a 开始,有一个内置且记录在案的函数可以执行此操作repelem

repelem复制数组的元素。
    W = repelem(V,N),使用向量V和标量N,创建一个向量W,其中的每个元素V都是重复的N时间。

第二个参数也可以是与V指定每个元素的复制次数相同长度的向量。对于 2D 复制:

B = repelem(A,N1,N2)

不再需要kron或其他技巧了!

更新:对于与其他快速方法的性能比较,请参阅数组元素的问答重复副本:MATLAB 中的运行长度解码

于 2014-12-10T23:18:28.800 回答
3
>> n=3;
>> a(floor((0:size(a,2)*n-1)/n)+1)

ans =

     1     1     1     2     2     2     3     3     3
于 2012-09-27T09:55:42.107 回答
3

一些异国情调的替代品。诚然,比有用更有趣:

  1. 将 的(第一个)结果分配meshgrid给一个向量:

    b = NaN(1,numel(a)*n); %// pre-shape result
    b(:) = meshgrid(a,1:n);
    
  2. 建立一个矩阵,乘以a得到结果:

    b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
    
  3. 用于ind2sub生成索引:

    [~, ind] = ind2sub([n 1],1:numel(a)*n);
    b = a(ind);
    
于 2013-12-27T22:33:38.253 回答
2

如果您有图像处理工具箱,还有另一种选择:

N = 3;
imresize(a, [1 N*numel(a)],'nearest')
于 2012-01-25T13:33:32.560 回答
1
% To get b = [1 1 1 2 2 2 3 3 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a,1,numel(temp_a));

% To get b = [1 2 3 1 2 3 1 2 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a',1,numel(temp_a));
于 2012-08-13T06:21:59.777 回答