如何重复向量的每个第3个元素?

时间:2017-01-31 04:25:01

标签: 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循环。有没有矢量化的方法来做到这一点?

5 个答案:

答案 0 :(得分:6)

执行此操作的一种方法是使用版本R2015b中发布的最新repelem函数,您可以在向量中重复一定次数的每个元素。在这种情况下,指定一个向量,其中每个第三个元素为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的向量,以确保为重复元素创建空间,然后确保在应用{{{{}}之前将每个第四个元素设置为0 1}}:

cumsum

因此:

N = numel(h);
rep = ones(1, N + 1 + (N / 4));
rep(4:4:end) = 0;
rep = cumsum(rep);
h_rep = h(rep);

最后一个建议(感谢用户@bremen_matt)将reshape您的向量转换为矩阵,以便它有3行,复制最后一行,然后将生成的重复矩阵重新整形为单个载体:

>> h_rep

h_rep =

     1     2     3     3     4     5     6     6     7     8     9     9    10    11    12    12

我们再次得到:

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 的长度可以被4整除。

答案 1 :(得分:6)

(根据rayryeng的正确观察进行修改)......

另一个解决方案是使用重塑功能。如果先将矩阵重新整形为3xn矩阵......

B = reshape(h,3,[])

然后复制最后一行

B = [B;B(end,:)]

最后将解决方案矢量化......

B(:).'

答案 2 :(得分:4)

您只能使用索引:

h = [1,2,3,4,5,6,7,8,9,10,11,12]; % initial data
n = 3; % step for repetition
h_rep = h(ceil(n/(n+1):n/(n+1):end));

答案 3 :(得分:3)

基于索引的方法(使用sort):

h_rep = h(sort([1:numel(h) 3:3:numel(h)]));

或稍短的语法......

h_rep = h(sort([1:end 3:3:end]));

答案 4 :(得分:1)

我认为这样做会:

h = [1,2,3,4,5,6,7,8,9,10,11,12];
h0=kron(h,[1 1])
h_rep=h0(mod(1:length(h0),2)==0 | mod(1:length(h0),3)==2)

答案:

1     2     3     3     4     5     6     6     7     8     9     9    10    11    12    12

说明: 复制每个元素后,只选择您想要的元素。您可以将此想法扩展为复制第二个和第三个。等。