假设我有一个一维数组:
a = [1, 2, 3];
是否有一个内置的 Matlab 函数,它接受一个数组和一个整数n
并将数组的每个元素复制 n 次?
例如调用replicate(a, 3)
应该返回[1,1,1,2,2,2,3,3,3]
。
请注意,这与repmat
. 我当然可以replicate
通过repmat
对每个元素执行并连接结果来实现,但我想知道是否有一个更有效的内置函数。
假设我有一个一维数组:
a = [1, 2, 3];
是否有一个内置的 Matlab 函数,它接受一个数组和一个整数n
并将数组的每个元素复制 n 次?
例如调用replicate(a, 3)
应该返回[1,1,1,2,2,2,3,3,3]
。
请注意,这与repmat
. 我当然可以replicate
通过repmat
对每个元素执行并连接结果来实现,但我想知道是否有一个更有效的内置函数。
a = [1 2 3];
N = 3;
b = reshape(repmat(a,N,1), 1, [])
从 R2015a 开始,有一个内置且记录在案的函数可以执行此操作repelem
:
repelem
复制数组的元素。
W = repelem(V,N)
,使用向量V
和标量N
,创建一个向量W
,其中的每个元素V
都是重复的N
时间。
第二个参数也可以是与V
指定每个元素的复制次数相同长度的向量。对于 2D 复制:
B = repelem(A,N1,N2)
不再需要kron
或其他技巧了!
更新:对于与其他快速方法的性能比较,请参阅数组元素的问答重复副本:MATLAB 中的运行长度解码。
>> 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));