创建具有重叠模式的MATLAB向量

时间:2013-11-22 14:08:42

标签: matlab design-patterns vector

我有一个包含模式的数组:

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]

有什么想法吗?

谢谢!

快速编辑:我需要多次复制,但我不提前知道这个数字。

2 个答案:

答案 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);