我有一个包含模式的数组:
p = [1, 2, 2, 1];
我想复制模式但需要添加第一个和最后一个元素。如果可能的话,我宁愿找到比循环更好的方法。
含义:
[1, 2, 2, 1]
[1, 2, 2, 1]
[1, 2, 2, 2, 2, 2, 1]
我发现了几乎完全符合我需要的东西:https://stackoverflow.com/a/15545970/2434277
但是我找不到一种方法来实现重叠加法。也就是说,它是这样做的:
[1, 2, 2, 1, 1, 2, 2, 1]
有什么想法吗?
谢谢!
快速编辑:我需要多次复制,但我不提前知道这个数字。
答案 0 :(得分:3)
你在寻找是否有意思?
> conv([1 0 0 0 1],[1 2 2 1])
1 2 2 1 1 2 2 1
> conv([1 0 0 1],[1 2 2 1])
1 2 2 2 2 2 1
conv的第一个参数也可能是稀疏矩阵:
full(sparse(1,[1 5 18],1))
1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1
conv(full(sparse(1,[1 5 18],1)),[1 2 2 1])
1 2 2 1 1 2 2 1 0 0 0 0 0 0 0 0 0 1 2 2 1
答案 1 :(得分:0)
这是一种方式:
p = [1, 2, 2, 1];
n = length(p);
p(end + n - 1) = 0; %//pad with 0s
p(n:end) = p(n:end) + p(1:n)
如果您愿意,也可以在一行中完成:
[p, zeros(1, length(p)-1] + [zeros(1, length(p)-1, p]
但如果您想要m
重复的一般解决方案,那么我建议您使用conv
(由user2987828回答),如下所示:
k = []; %// Leave off this line if you are certain that k won't exist yet
n = length(p);
k(1:n-1:(n-1)*m+1)=1;
conv(k,p);