Matlab中的元素阵列复制

假设我有一维数组:
a = [1, 2, 3];
是否有一个内置的Matlab函数,它接受一个数组和一个整数
n
并复制每个 数组元素n次? 例如,调用
replicate(a, 3)
应该返回
[1,1,1,2,2,2,3,3,3]
。 请注意,这与
repmat
完全不同。我当然可以通过对每个元素执行
repmat
并连接结果来实现
replicate
,但我想知道是否有更高效的内置函数。     
已邀请:
从R2015a开始,有一个内置和记录的功能来执行此操作,
repelem
:   
repelem
复制数组的元素。           
W = repelem(V,N)
,使用矢量
V
和标量
N
,创建一个矢量
W
,其中
V
的每个元素重复
N
次。 第二个参数也可以是与
V
长度相同的向量,以指定每个元素的复制数。对于2D复制:
B = repelem(A,N1,N2)
不再需要
kron
或其他技巧! 更新:要与其他快速方法进行性能比较,请参阅数组元素的Q& A重复副本:MATLAB中的运行长度解码。     
我是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
    
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
    
一些奇特的选择。不可否认,有趣的是: 将
meshgrid
的(第一个)结果赋给向量:
b = NaN(1,numel(a)*n); %// pre-shape result
b(:) = meshgrid(a,1:n);
构建一个乘以
a
的矩阵得到结果:
b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
使用
ind2sub
生成索引:
[~, ind] = ind2sub([n 1],1:numel(a)*n);
b = a(ind);
    
如果您有图像处理工具箱,还有另一种选择:
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));
    

要回复问题请先登录注册