在Matlab中元素明智的数组复制
比方说,我有一个一维数组:
a = [1,2,3];
有一个内置的Matlab函数,它接受一个数组和一个整数n
并且复制数组中的每个元素n次?
例如调用replicate(a, 3)
应该返回[1,1,1,2,2,2,3,3,3]
。
请注意,这与repmat
完全不一样。 我当然可以通过对每个元素进行repmat
并连接结果来实现replicate
,但是我想知道是否有一个更高效的内置函数。
从R2015a开始 ,有一个内置的loggingfunction来做到这一点, repelem
:
repelem
重复数组的元素。
W = repelem(V,N)
,向量V
和标量N
创build一个向量W
,其中V
每个元素重复N
次。
第二个参数也可以是一个长度与V
相同的向量来指定每个元素的复制次数。 对于2D复制:
B = repelem(A,N1,N2)
不再需要kron
或其他技巧!
更新:为了与其他快速方法进行性能比较,请参阅问与答数组元素的重复副本:在MATLAB中运行长度解码 。
我是KRONfunction的粉丝:
>> a = 1:3; >> N = 3; >> b = kron(a,ones(1,N)) b = 1 1 1 2 2 2 3 3 3
你也可以看看这个相关的问题 (涉及二维matrix的复制元素),看看涉及matrix索引的其他解决scheme。 这是一个这样的解决scheme(受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
一些奇特的select。 无可否认比有用的更有趣:
-
将
meshgrid
的(第一个)结果meshgrid
给一个向量:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
-
build立一个乘以a的matrix给出结果:
b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
-
使用
ind2sub
生成索引:[~, ind] = ind2sub([n 1],1:numel(a)*n); b = a(ind);
如果你有image processing工具箱,还有另一种方法:
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));