我有这样的矢量:
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
循环。有没有矢量化的方法来做到这一点?
答案 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
说明: 复制每个元素后,只选择您想要的元素。您可以将此想法扩展为复制第二个和第三个。等。