2013-04-18 328 views
1

矩陣值來更新for循環如下:矢量化循環,其涉及在MATLAB

N = 2;T = 3; 
Trials = rand(N,T); 
for i=1:N 
    for j=1:T 
     AverageValue = mean2(Trials); 
     Trials(i,j) = Trials(i,j) - AverageValue; 
    end 
end 

的困難在於AverageValue根據每個更新的Trials改變其值。

===========================================

更新版本的 'mean2' 由 'trapz'代替:

N=4;T=5; 
Trials=rand(N,T); 
for i=1:N 
    for j=1:T 
     IntValue=trapz(trapz(Trials(1:3,2:5))); 
     Trials(i,j)=Trials(i,j)+IntValue; 
    end 
end 

請幫幫忙,謝謝!

+0

感謝yuk回答!但'mean2'正是我想要的。這就是爲什麼每次迭代後「試驗」矩陣都會改變...... –

回答

2

下面的代碼將產生輸出在後您的例子一樣:

n = numel(Trials); 
Trials = Trials - mean2(Trials)*reshape(((n-1)/n).^(0:n-1), T, N)'; 

說明:通過觀察你平均的遞歸減法創造了你必須爲每個當前平均m一個模式形式的關係:

m(k) = m(k-1) - m(k-1)/n = ((n-1)/n)*m(k-1); % symbolic 

因此,你可以直接從您的原始減去一個矩陣與嵌入式遞歸,即

[m(1) m(2) m(3); 
m(4) m(5) m(6)]; 

其中每個m替換分​​析使用根據規則m(k)= (((n-1)/n)^(k-1)*)m(1);,其中m(1)是原始矩陣的平均先前值的acummulation。

+0

非常感謝您的回答。有用。我想知道這個原理是否可以應用於除mean2之外的其他函數,例如「Trials」的整數函數? –

+0

@huynhkhactuan遞歸原則將起作用,只要你可以像這樣編寫/寫入你的函數。 – gevang

+0

親愛的gevang,我更新了'trap2'代替'mean2'的代碼。我理解了這個原理,但我無法爲更新後的版本建立遞歸關係。你能幫我把它矢量化嗎?非常感謝。 –