2013-11-22 38 views
1

一個MATLAB矢量I具有包含圖案的陣列:創建具有重疊圖案

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

通過所需大小的矢量只是循環和投入取決於索引的合適數量。我在索引上使用了mod來計算出哪個數字。它確實工作正常;我只是想知道是否有更好的,非暴力的方式來做到這一點。 – thekamz

+0

你想寫[1,2,2,1,2,2,1]而不是[1,2,2,2,2,2,1]嗎? – user2987828

+0

@ user2987828:否 - 我需要上一個副本的最後一個元素和下一個副本的第一個元素添加。 – thekamz

回答

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 (由用戶2987828回答)這樣的:

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); 
+0

太棒了,接受。比我的循環方法好得多。如果有更多的想法,這將很有趣。 @丹,謝謝! – thekamz

3

它是合作nv你正在尋找?

> 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 
+0

非常酷。我知道它類似於我之前見過的手術!謝謝! – thekamz

+0

這很好,因爲你可以一次複製多次:'conv([1 0 0 1 0 0 1 0 0 1],[1 2 2 1])'或者一般情況下(即複製'n'次: k(1:length(p)-1:(length(p)-1)* n + 1)= 1; conv(k,p);' – Dan

+0

+1這也是我的第一個想法 –