假设我有一个一维数组:

a = [1, 2, 3];

有没有一个内置的Matlab函数可以接受一个数组和一个整数 n 并复制数组n次的每个元素?

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

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

有帮助吗?

解决方案

<强>如图R2015a 的,有一个内置-in和记录功能来做到这一点,repelem

  

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

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

B = repelem(A,N1,N2)

无需kron或其他的技巧了!

<强>更新:用于与其他迅速方法的性能比较,请参阅Q&数组元素的重复拷贝:在MATLAB 运行长度解码

其他提示

我是 的粉丝 科隆 功能:

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

b =

    1     1     1     2     2     2     3     3     3

您还可以看看 这个相关问题 (涉及复制二维矩阵的元素)以查看一些涉及矩阵索引的其他解决方案。这是一个这样的解决方案(灵感来自 艾德里克的回答):

>> 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

一些奇异的替代品。诚然,有趣多于有用:

  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);
    

如果你有图像处理工具箱,还有另外一个替代的:

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));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top