在Matlab中元素明智的数组复制

比方说,我有一个一维数组:

 a = [1,2,3];

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

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

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

从R2015a开始 ,有一个内置的loggingfunction来做到这一点, repelem

repelem重复数组的元素。
W = repelem(V,N) ,向量V和标量N创build一个向量W ,其中V每个元素重复N次。

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

 B = repelem(A,N1,N2) 

不再需要kron或其他技巧!

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

我是KRONfunction的粉丝:

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

你也可以看看这个相关的问题 (涉及二维matrix的复制元素),看看涉及matrix索引的其他解决scheme。 这是一个这样的解决scheme(受Edric的回答启发):

 >> b = a(ceil((1:N*numel(a))/N)) b = 1 1 1 2 2 2 3 3 3 
 a = [1 2 3]; N = 3; b = reshape(repmat(a,N,1), 1, []) 
 >> n=3; >> a(floor((0:size(a,2)*n-1)/n)+1) ans = 1 1 1 2 2 2 3 3 3 

一些奇特的select。 无可否认比有用的更有趣:

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

     b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n); 
  2. build立一个乘以a的matrix给出结果:

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

     [~, ind] = ind2sub([n 1],1:numel(a)*n); b = a(ind); 

如果你有image processing工具箱,还有另一种方法:

 N = 3; imresize(a, [1 N*numel(a)],'nearest') 
 % 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));