我有一个这样的向量:
h = [1,2,3,4,5,6,7,8,9,10,11,12]
我想像这样重复每三个元素:
h_rep = [1,2,3,3,4,5,6,6,7,8,9,9,10,11,12,12]
我如何在 MATLAB 中优雅地完成这项工作?实际数组很大,所以理想情况下我不想编写 for
循环。有没有矢量化的方法来做到这一点?
最佳答案
一种方法是使用最近的 repelem
在版本 R2015b 中发布的函数,您可以在其中将向量中的每个元素重复一定次数。在这种情况下,指定一个向量,其中每三个元素为 2,其余值为 1 作为重复相应元素的次数,然后使用函数:
N = numel(h);
rep = ones(1, N);
rep(3:3:end) = 2;
h_rep = repelem(h, rep);
使用您的示例:h = 1 : 12
,我们因此得到:
>> h_rep
h_rep =
1 2 3 3 4 5 6 6 7 8 9 9 10 11 12 12
如果 repelem
对您不可用,那么巧妙地使用 cumsum
可能有帮助。基本上,请注意,对于每三个元素,下一个元素是前一个元素的副本。如果我们有一个指标向量 [1 1 1 0]
,其中 1
是我们要复制的位置,0
告诉我们复制最后一个值,在该向量的重复版本上使用累积和或 cumsum
- 恰好 1 + (numel(h)/4)
将准确地给出我们需要的位置索引到 h
。因此,创建一个向量,其长度为 h
加上 1 + (numel(h)/4
以确保我们为重复元素腾出空间,然后在应用 cumsum
之前确保每隔四个元素设置为 0:
N = numel(h);
rep = ones(1, N + 1 + (N / 4));
rep(4:4:end) = 0;
rep = cumsum(rep);
h_rep = h(rep);
因此:
>> h_rep
h_rep =
1 2 3 3 4 5 6 6 7 8 9 9 10 11 12 12
最后一个建议(感谢用户 @bremen_matt )是 reshape
将向量转换为矩阵,使其具有 3 行,复制最后一行,然后将生成的复制矩阵重新整形为单个向量:
h_rep = reshape(h, 3, []);
h_rep = reshape([h_rep; h_rep(end,:)], 1, []);
我们再次得到:
>> h_rep
h_rep =
1 2 3 3 4 5 6 6 7 8 9 9 10 11 12 12
当然,上面代码的明显警告是向量 h
的长度可以被 4 整除。
关于arrays - 如何重复向量的每第三个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949614/