假设我有一维数组:
a = [1, 2, 3];
是否有内置的Matlab函数,它接受一个数组和一个整数n
并复制每个函数
数组的元素n次?
例如,调用replicate(a, 3)
应该返回[1,1,1,2,2,2,3,3,3]
。
请注意,这与repmat
完全不同。我当然可以通过对每个元素执行replicate
并连接结果来实现repmat
,但我想知道是否存在更高效的内置函数。
答案 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)
一些奇特的替代品。不可否认,这比有用更有趣:
将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);
答案 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));