2015-10-13 42 views
0

比方說,我們有一個「狄拉克梳」這給一些「模式」的開始位置:插入小矢量成一個較大的

N_pattern = 5; pattern = rand(1,N_pattern); 
N = 100; dirac_comb = zeros(1, N); 
idx = [1 20 50 80];   % let's say we want four occurrences of the pattern inside the final_vector 
dirac_comb (idx) = 1;   % let's say this the comb with the positions of patterns 

所有我想要做的是插入「模式」矢量在狄拉克梳子指示的位置上。通常情況下,這可以通過卷積來完成:

final_vector = conv(dirac_comb, pattern); 

我不想因爲我用非常大的載體,因此它是非常緩慢的使用卷積。 Dirac梳子在這個問題中的存在有點被迫,idx變量可能足以解決這個問題。

第一個問題:如何插入在final_vect在由idx指示的位置的「模式」,以量化的方式。

第二個問題:比方說,我們隨機化了模式的位置idx,所以有可能兩個模式相交。如果發生這種情況,我必須總結這兩種模式(交叉區域)。

idx = randi([1 N-N_pattern],[1, 8]); % lets' say we have 8 occurrences 

應該有可能考慮到這個總結,但以矢量化的方式嗎?

+0

關於第二個問題:這不是微不足道的,不是嗎?如果你在你的Dirac中梳理了兩個相鄰的'1',你就可以將這個模式相鄰兩次。爲了有重疊,你必須逐個包含模式,所以你必須爲擴展的部分處理的'final_vector'生成每個新的'idx'。這不正確嗎? –

+0

如果我理解@andras的問題,問題是一次包含所有模式。 –

回答

1

要在不使用conv()的情況下將模式插入到final_vector中,您可以在MATLAB中使用複製和索引。

首先,您需要擴充idx,以便代替它包含應該放置的範圍的起始元素pattern它包含所有索引。我們可以做到這一點使用bsxfun()(如@Andras Deak指出)

>> idx = [1 20 50 80]; 
>> indexes = bsxfun(@plus,idx',0:N_pattern-1) 
indexes = 

    1  2  3  4  5 
    20 21 22 23 24 
    50 51 52 53 54 
    80 81 82 83 84 

,那麼你可以通過idx索引向量,並用repmat()bsxfun()複製pattern插入patternfinal_vector(再次指出,通過@Andras Deak)以適應這些索引

>> final_vector = zeros(1, length(dirac_comb) + length(pattern) - 1); 
>> final_vector(indexes) = repmat(pattern, size(indexes, 1), 1); 

>> final_vector = zeros(1, length(dirac_comb) + length(pattern) - 1); 
>> final_vector(indexes) = bsxfun(@plus, pattern, zeros(numel(idx), 1)); 

只是需要注意一點,我不認爲以前需要提及。 conv()產生長度爲length(dirac_comb) + length(pattern) - 1的矢量。產生與conv()相同的長度final_vector應分配給final_vector = zeros(1, length(dirac_comb) + length(pattern) - 1);

+0

如果我可能會建議:'bsxfun(@ plus,idx',0:N_pattern-1)'會照顧索引矩陣:)我建議在這種情況下反對'length':如果有更多的內含物比模式長度?建議'size(idx,2)'代替。 –

+0

@AndrasDeak謝謝!首先我嘗試了一個'bsxfun'解決方案,但我還沒有太過於熟練。 – IKavanagh

+0

另外,如果將原始矢量'idx'保留爲'idx0',則可以用'bsxfun(@ plus,pattern,zeros(length(idx0),1))'完成第二個repmat。從最初的'idx'的長度開始,定義'N_spikes'或者什麼是最合乎邏輯的。但是這取決於OP。 **編輯**:我剛剛意識到原來的'numel/length'正好是'size(idx,1)':) –