Matlab 中的逐元素数组复制
-
21-09-2019 - |
题
假设我有一个一维数组:
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 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
一些奇异的替代品。诚然,有趣多于有用:
分配(第一个)结果
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));
不隶属于 StackOverflow