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

标签 arrays matlab vectorization

我有一个这样的向量:

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/

相关文章:

mysql - 从Mysql中的日期范围中提取所有日期

python - 在numpy数组中没有for循环的迭代

Javascript 数组测试在为 True 时表现为 False

c++ - 将 C/C++ 代码作为 MEX 文件调用与纯 C/C++

c# - MATLAB 与 Visual C++ 进行图像处理

matlab - 在 Octave/Matlab 的 arrayfun 中使用 if 子句

python - 有效地减去不同形状的numpy数组

matlab - 如何向量化从向量中找到最近的点

javascript - 如果输入包含数组中的任何单词

javascript - 比较二维数组与一维数组的值