Matlab中的元素阵列复制

时间:2009-12-22 17:23:44

标签: arrays matlab repeat run-length-encoding elementwise-operations

假设我有一维数组:

a = [1, 2, 3];

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

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

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

7 个答案:

答案 0 :(得分:21)

我是KRON函数的粉丝:

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

b =

    1     1     1     2     2     2     3     3     3

您还可以查看this related question(处理2-D矩阵的复制元素)以查看涉及矩阵索引的其他一些解决方案。这是一个这样的解决方案(灵感来自Edric's answer):

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

b =

    1     1     1     2     2     2     3     3     3

答案 1 :(得分:20)

a = [1 2 3];
N = 3;

b = reshape(repmat(a,N,1), 1, [])

答案 2 :(得分:13)

自R2015a 起,有built-in and documented function to do this, repelem

  

repelem复制数组的元素       带有向量W = repelem(V,N)和标量V的{​​{1}}会创建一个向量N,其中W的每个元素重复V次。

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

V

不再需要B = repelem(A,N1,N2) 或其他技巧了!

更新:要与其他快速方法进行效果比较,请参阅问答Repeat copies of array elements: Run-length decoding in MATLAB

答案 3 :(得分:3)

>> n=3;
>> a(floor((0:size(a,2)*n-1)/n)+1)

ans =

     1     1     1     2     2     2     3     3     3

答案 4 :(得分: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);
    

答案 5 :(得分:2)

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

N = 3;
imresize(a, [1 N*numel(a)],'nearest')

答案 6 :(得分: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));