gpt4 book ai didi

arrays - 如何重复向量的每第三个元素?

转载 作者:行者123 更新时间:2023-12-02 05:24:30 26 4
gpt4 key购买 nike

我有一个这样的向量:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com